Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Xaml标记文本转换字典<;串、刷>;可能的_C#_Wpf_Xaml_Converter - Fatal编程技术网

C# WPF Xaml标记文本转换字典<;串、刷>;可能的

C# WPF Xaml标记文本转换字典<;串、刷>;可能的,c#,wpf,xaml,converter,C#,Wpf,Xaml,Converter,我的目标是根据数据源的特定文本属性更改控件的背景(笔刷) 我在一个更简单(有效)的示例中实现了这一点,当时我的转换器只有两个笔刷属性: <local:ListErrorWarndescriptionToColorConverter x:Key="ErrorListToColor" NormalBrush="Transparent" ErrorBrush="Red" WarnBrush="Yellow"/> 下一步是编写转换器来处理

我的目标是根据数据源的特定文本属性更改控件的背景(笔刷)

我在一个更简单(有效)的示例中实现了这一点,当时我的转换器只有两个笔刷属性:

<local:ListErrorWarndescriptionToColorConverter x:Key="ErrorListToColor"
                        NormalBrush="Transparent" ErrorBrush="Red" WarnBrush="Yellow"/>

下一步是编写转换器来处理2个以上的字符串

我的转换器代码:

public class StringToBrushDictionary : Dictionary<string, Brush> { }

[ValueConversion(typeof(string), typeof(Brush))]
public sealed class TextToBrushConverter : IValueConverter
{

    public StringToBrushDictionary LookUpTable { get; set; }
    public Brush Default { get; set; }

    public TextToBrushConverter()
    {
        // set defaults
        LookUpTable = new StringToBrushDictionary();
        Default = Brushes.Transparent;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = value as string;
        if (collection == null)
            return Default;
        if (LookUpTable.ContainsKey(collection))
            return LookUpTable[collection];
        return Default;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }
}
公共类StringToBrushDictionary:Dictionary{}
[ValueConversion(类型(字符串)、类型(画笔))]
公共密封类TextToBrushConverter:IValueConverter
{
公共StringToBrushDictionary可查找{get;set;}
公共笔刷默认值{get;set;}
公共文本转换程序()
{
//设置默认值
LookUpTable=新的StringToBrushDictionary();
默认值=画笔。透明;
}
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
var collection=字符串形式的值;
if(集合==null)
返回默认值;
if(LookUpTable.ContainsKey(集合))
返回可查找的[集合];
返回默认值;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回null;
}
}
我现在的问题是:如何用xaml填充字典 我发现了,但它并不完全是我所需要的,因为它使用string和int这两种“本机”数据类型,还使用VS2010,它不支持字典(根据那里的答案)。有一个回答说,更高版本的XAML可以做到这一点,但VS2010还没有实现它

以下是我对转换器标记的看法以及我已经尝试过的内容:

<Application x:Class="BetterListbox.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:BetterListbox"
              xmlns:System="clr-namespace:System;assembly=mscorlib"
             xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib"
             xmlns:Specialized="clr-namespace:System.Collections.Specialized;assembly=System"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
        <local:ListErrorWarndescriptionToColorConverter x:Key="ErrorListToColor"
                                                        NormalBrush="Transparent" ErrorBrush="Red" WarnBrush="Yellow"/>

        <local:TextToBrushConverter x:Key="WarnErrorToBrush" Default="Red">
            <local:TextToBrushConverter.LookUpTable>
                <local:StringToBrushDictionary>
                    <Brush x:Key="Error" >
                        ...?                        
                    </Brush>
                    <collections:DictionaryEntry x:Key="d"  Value="Brushes.Red" />

                </local:StringToBrushDictionary>
            </local:TextToBrushConverter.LookUpTable>
        </local:TextToBrushConverter>
    </Application.Resources>
</Application>

...?                        

甚至可以在xaml中填充
LookUpTable
,如果可以,如何填充?

您可以这样填充:

<my:TextToBrushConverter x:Key="textToBrush">
    <my:TextToBrushConverter.LookUpTable>
        <!-- LookUpTable["red"] = Brushes.Red -->
        <x:Static MemberType="Brushes" Member="Red" x:Key="red" />
        <!-- LookUpTable["aqua"] = new SolidColorBrush(Colors.Aqua) -->
        <SolidColorBrush Color="Aqua" x:Key="aqua" />
        <!-- custom color brush -->
        <SolidColorBrush Color="#234433" x:Key="green" />
    </my:TextToBrushConverter.LookUpTable>
</my:TextToBrushConverter>


“我发现这个(8岁)的问题是用xaml创建字典?但这不是我真正需要的。”--它看起来确实像你需要的。如果这个问题的答案不能解决你的问题,那该怎么办?如果你认为它不是复制品,你需要解释原因。仅仅说这不是答案对任何人都没有任何好处。@PeterDuniho我指出了区别没有版本的VS支持新的XAML功能。您也可以使用VS2010。至于值的类型问题,期望找到与您的用例完全匹配的词典示例是不现实的。您是否认为MSDN有缺陷仅仅是因为
System.Collections.Generic.Dictionary
的文档没有特别提到您的
Brush
场景。。。。。。您需要在头脑中区分关于词典的问题和关于在XAML中表示非原始类型的问题。你需要关于后者的信息并不意味着你的问题与前一部小说或现有的问题有所不同。正如标题中所述,这个问题是关于
WPF Xaml标记的
我每天使用字典,但我对WPF是新手,xamlit说:“在这里
找不到目标类型上的成员“Red”
,但其他两条线是可行的perfectly@FrankMWPF设计器就是这么说的,但实际上(在运行时)它是有效的。不幸的是,WPF设计器不太可靠,可能会产生错误。您是对的:)非常感谢