gpt4 book ai didi

c# - 来自代码的带有样式和 DateTriggers 的 DataTemplate

转载 作者:行者123 更新时间:2023-11-30 15:38:24 26 4
gpt4 key购买 nike

我创建了这个 DataTemplate,但我不知道如何将带有 DataTriggerstyle 添加到 img 变量。

我希望 img 根据 Suppliers[i].Stock (int) 的值显示不同的图像

资源图标

Properties.Resources.InStock     => Suppliers[i].Stock > 0
Properties.Resources.OutOfStock => Suppliers[i].Stock = 0
Properties.Resources.Unknown => Suppliers[i].Stock = null

到目前为止我的代码。

private DataTemplate GetStockTemplate(int i)
{
var template = new DataTemplate();

var wp = new FrameworkElementFactory(typeof (WrapPanel));
wp.SetValue(FrameworkElement.HorizontalAlignmentProperty, HorizontalAlignment.Right);
wp.SetValue(WrapPanel.OrientationProperty, Orientation.Horizontal);

var tx = new FrameworkElementFactory(typeof (TextBox));
tx.SetBinding(TextBox.TextProperty, new Binding("Suppliers[" + i + "].Stock") {StringFormat = "{0:n0}"});
tx.SetValue(TextBoxBase.IsReadOnlyProperty, true);
tx.SetValue(Control.BorderThicknessProperty, new Thickness(0));
tx.SetValue(Control.BackgroundProperty, Brushes.Transparent);
tx.SetValue(TextBox.TextAlignmentProperty, TextAlignment.Right);

wp.AppendChild(tx);

var img = new FrameworkElementFactory(typeof (Image));
wp.AppendChild(img);

template.VisualTree = wp;
template.Seal();
return template;
}

我认为触发器的工作方式是,创建一个显示 InStock 图标的默认样式,然后为 Stock = null 和另一个为 Stock = 0 打开两个触发器>

由于我是动态执行此操作的,所以我不能使用 xaml,而我使用 DataTemplate 进行其他所有操作。

解决方案

在@akjoshi 的帮助下,这就是我最终使用的。

var img = new FrameworkElementFactory(typeof(Image));
var binding = new Binding("Suppliers[" + i + "].Stock") {Converter = new StockIconConverter()};
img.SetBinding(Image.SourceProperty, binding);
wp.AppendChild(img);

class StockIconConverter :IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || (int)value < 0)
return ConvertIconToBitmapImage(Properties.Resources.Unknown);

return ConvertIconToBitmapImage((int)value == 0 ? Properties.Resources.OutOfStock : Properties.Resources.InStock);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}

#region Helper
private static BitmapImage ConvertIconToBitmapImage(Icon icon)
{
var bitmap = icon.ToBitmap();
var ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
var bImg = new BitmapImage();

bImg.BeginInit();
bImg.StreamSource = new MemoryStream(ms.ToArray());
bImg.CreateOptions = BitmapCreateOptions.None;
bImg.CacheOption = BitmapCacheOption.Default;
bImg.EndInit();
bImg.Freeze();

ms.Close();

return bImg;
}
#endregion
}

最佳答案

我觉得你的想法是对的,代码应该是这样的——

var img = new FrameworkElementFactory(typeof(Image)); 
img.SetValue(Image.SourceProperty, "InStockImagePath");

Style style = new Style();
style.TargetType = typeof(Image);

DataTrigger zeroDataTrigger = new DataTrigger();
zeroDataTrigger.Binding = new Binding("Suppliers[" + i + "].Stock");
zeroDataTrigger.Value = 0;
zeroDataTrigger.Setters.Add(new Setter(Image.SourceProperty, "OutOfStockImagePath"));

DataTrigger nullDataTrigger = new DataTrigger();
nullDataTrigger.Binding = new Binding("Suppliers[" + i + "].Stock");
nullDataTrigger.Value = null;
nullDataTrigger.Setters.Add(new Setter(Image.SourceProperty, "unknownImagePath"));

style.Triggers.Add(zeroDataTrigger);
style.Triggers.Add(nullDataTrigger);

img.SetValue(Image.StyleProperty, style);
wp.AppendChild(img);

我建议您查看 Sacha 的以下与此相关的精彩文章 -

WPF: How to create Styles in code/and magical Content

作为旁注,FrameworkElementFactorydeprecated ,最好在 Resources/xaml 中定义此样式并使用 FindResource()设置它。如果重新设计可以让您实现这一目标,那么我建议您这样做。

关于c# - 来自代码的带有样式和 DateTriggers 的 DataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11519377/

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