我可以帮您将一个WPF XAML中的数据模板转换成C#代码,也就是说,我可以在.cs文件中通过编程方式创建按钮。
XAML代码如下:
<ItemsControl DataContext="{Binding Source={StaticResource Things}}" ItemsSource="{Binding}" Name="buttons" Margin="0">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:FishEyePanel ScaleToFit="false"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Button Command="Open" Tag="{Binding XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
这一行:
<Button Command="Open" Tag="{Binding XPath=@Tag, Path=Value}" Margin="5" Padding="5" HorizontalContentAlignment="Center" Width="{Binding XPath=@Width}" Height="{Binding XPath=@Height}"/>
这里是我将所有按钮绑定到一个XML文件的地方,以下是文件内容:
<XmlDataProvider x:Key="Things" XPath="Things/Thing">
<x:XData>
<Things xmlns="">
<Thing Button="uno1" Tag="abc" Width="200" Height="200"/>
</Things>
</x:XData>
</XmlDataProvider>
但是我希望的是,不要使用预定义的所有按钮来调用XML文件,而是调用C#中的一种方法来处理这些按钮,就像这样:
public void createButtons()
{
Button button = new Button();
button.Tag = "I am from cs";
buttons.Items.Add(button);
}
这是可能的吗?
createButtons()
方法到底是哪里出了问题?一般来说,在XAML中可以做的事情在C#代码中也是可以做到的。 - O. R. Mapperbuttons.ItemContainerStyle
和buttons.ItemsPanel
,查看它们的类型,然后从那里开始。我不太明白为什么你首先想要做这件事。如果你解释一下为什么想要这样做,有人可能会建议更好的方法。 - Tim S.DataTemplates
或者模板相关的问题。这个人@Fernando-Santiago试图打开一扇他/她很快会后悔的门 :) - Alex FThings
中的每个Thing
都创建一个按钮吗?如果是这样,那么你的代码似乎已经在尝试做到这一点了(至少是在尝试),如果可能的话,我建议你在XAML中完成所有操作。如果关系比这更复杂,我建议你用一个用户控件来替换你的<Button Command="Open"...
,并在其Loaded
事件触发时使用代码动态生成基于其DataContext的适当按钮。这样,你就可以使用代码来生成或显示/隐藏正确的元素,同时仍然在XAML中声明大多数内容。 - Tim S.