3

this を作成しましたが、 aを使用してimg変数DataTemplateに追加する方法がわかりません。styleDataTrigger

(int)の値に応じてimgに異なる画像を表示したいSuppliers[i].Stock

リソース アイコン

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 アイコンを表示するデフォルトのスタイルを作成し、次に 2 つのトリガーをオンにしStock = null、もう 1 つのトリガーを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
}
4

1 に答える 1

5

あなたの考えは正しいと思います。コードは次のようにする必要があります-

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: コード/および魔法のコンテンツでスタイルを作成する方法

補足として、deprecatedFrameworkElementFactoryであるため、このスタイルを で定義し、を使用して設定することをお勧めします。再設計によってこれを達成できる場合は、それを行うことをお勧めします。Resources/xamlFindResource()

于 2012-07-17T09:47:23.883 に答える