gpt4 book ai didi

c# - 如何通过 XAML 中定义的数据模板以编程方式创建元素?

转载 作者:行者123 更新时间:2023-12-02 11:17:02 24 4
gpt4 key购买 nike

我正在尝试创建多个带有文本的按钮,并在运行时将它们添加到代码中的 Stackpanel 中。我根据数据列表创建按钮。这是我的代码:

XAML

<StackPanel x:Name="MainSP" />

C#

foreach (item in ItemList)
{
Button newBtn = new Button();
Image buttonImage = new Image();
buttonImage.Width = 100;
buttonImage.Height = 100;
buttonImage.Stretch = Systems.Windows.Media.Stretch.Uniform;
buttonImage.Source = new BitmapImage(pokemon.ImageURI);
newBtn.Tag = item.Id;
newBtn.Name = String.Format("{0}Button", item.Name);
newBtn.Click += new RoutedEventHandler(newBtn_Click);

FamilyStackPanel.Children.Add(newBtn);
}

我知道这是笨拙的编程。我真的想在 XAML 中设置 ControlTemplate,然后在代码中创建按钮时重用它。这是 XAML:

<ControlTemplate x:Key="ButtomTemplate" TargetType="Button">
<Grid Height="108" Width="Auto" Margin = "6,6">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Image Width = "54" Height="54" Stretch="UniformToFill" Grid.Row="0">
<Image.Source>
<BitmapImage UriSource="{Binding ImageUri}" CreateOptions="BackgroundCreation"/>
</Image.Source>
</Image>
<TextBlock Text="{Binding Name}"
Foreground ="{StaticResource PhoneAccentBrush}" />
</Grid>
</ControlTemplate>

我尝试像上面一样使用 controlTemplate,然后对于绑定(bind),我在代码中设置了 newbtn.DataContext。

foreach (Families item in ItemList)
{
Button newBtn = new Button();
newBtn.Template = this.Resources["ButtonTemplate"] as ControlTemplate;
newBtn.Tag = item.Id;
newBtn.Name = String.Format("{0}Button", item.Name);
newBtn.Click += new RoutedEventHandler(newBtn_Click);
newBtn.DataContext = item;

FamilyStackPanel.Children.Add(newBtn);
}

对于数据上下文,我也尝试过 newBtn.DataContext = ItemList[itemIndex] 但这似乎不起作用。我得到的只是一个空白屏幕。

所以我已经通过按钮创建背后的纯代码解决了这个问题,但我正在尝试使用 XAML 控件模板来使其工作。有什么想法吗?

谢谢!

最佳答案

在 WPF 中的过程代码中创建或操作 UI 元素几乎永远都不是正确的方法。

在某些情况下这会很有用,但您呈现的这种情况是 ItemsControl 最简单的情况.

<ItemsControl ItemsSource="{Binding ItemList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Click="Button_OnClick">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Height="108" Width="Auto" Margin = "6,6">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Image Width = "54" Height="54" Stretch="UniformToFill" Grid.Row="0">
<Image.Source>
<BitmapImage UriSource="{Binding ImageUri}" CreateOptions="BackgroundCreation"/>
</Image.Source>
</Image>
<TextBlock Text="{Binding Name}"
Foreground ="{StaticResource PhoneAccentBrush}" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

背后代码:

    private void Button_OnClick(object sender, RoutedEventArgs e)
{
var button = sender as Button;
var dataitem = button.DataContext as [YourItemclass];

//... here you can perform actions on the dataitem.
}
  • 使用 ItemsControl,您可以让 WPF 为每个项目创建 UI,而不是您自己创建。
  • 每个按钮的 DataContext 还将由 WPF 设置为基础集合中相应的数据项。
  • 无需使用 Tag 属性或类似的东西来进行可怕的黑客攻击。
  • StackPanel 是默认值 ItemsPanel对于 ItemsControl,但您可以通过设置 ItemsPanel 将其更改为另一个面板(例如 WrapPanel)

关于c# - 如何通过 XAML 中定义的数据模板以编程方式创建元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20591023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com