如何以及在简单XAML窗口中为转换器创建StaticResource密钥的位置?

B.B*_*dan 4 c# wpf xaml ivalueconverter staticresource

我有一个简单的WPF XAML窗口,我需要在以下XAML中创建一个StaticResource密钥。

XAML源代码是

<Window x:Class="WpfApplication1.Trigger"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:super="clr-namespace:WpfApplication1"
        Title="Trigger" Height="300" Width="300">
    <Grid>
        <Border x:Name="m_Border" Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FFF2FFC6" Margin="0,20,0,0">
            <Button x:Name="btn" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Visibility="{Binding IsMouseOver,ElementName=m_Border, Converter={StaticResource BooleanToVisibilityConverterKey}, ConverterParameter=Normal}"/>
        </Border>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

我的转换器C#源代码:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1
{

    public enum BooleanToVisibilityConverterType
    {
        Normal = 1,
        Reverse = 2
    }

    public class BooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var targertValue = false;

            if (value == null)
            {
                throw new Exception("BooleanToVisibilityConverter - Convert Error");
            }
            else if (!Boolean.TryParse(value.ToString(), out targertValue))
            {
                throw new Exception("BooleanToVisibilityConverter - Convert Error");
            }
            else
            {
                var parameterValue = BooleanToVisibilityConverterType.Normal;

                if (parameter != null)
                {
                    Enum.TryParse<BooleanToVisibilityConverterType>(parameter.ToString(), out parameterValue);
                }

                if (parameterValue == BooleanToVisibilityConverterType.Reverse)
                {
                    return targertValue ? Visibility.Collapsed : Visibility.Visible;
                }
                else
                {
                    return targertValue ? Visibility.Visible : Visibility.Collapsed;
                }
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var targetValue = Visibility.Collapsed;

            if (value == null)
            {
                throw new Exception("BooleanToVisibilityConverter - ConvertBack Error");
            }
            else if (!Enum.TryParse<Visibility>(value.ToString(), out targetValue))
            {
                throw new Exception("BooleanToVisibilityConverter - ConvertBack Error");
            }
            else
            {
                var parameterValue = BooleanToVisibilityConverterType.Normal;

                if (parameter != null)
                {
                    Enum.TryParse<BooleanToVisibilityConverterType>(parameter.ToString(), out parameterValue);
                }

                if (parameterValue == BooleanToVisibilityConverterType.Reverse)
                {
                    return targetValue == Visibility.Visible ? false : true;
                }
                else
                {
                    return targetValue == Visibility.Visible ? true : false;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要一个名称为BooleanToVisibilityConverterKey 的转换器密钥作为转换器BooleanToVisibilityConverter

Mik*_*son 6

您可以ConverterWindow.Resources元素中定义您的。

<Window ...
        >
    <Window.Resources>
        <super:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverterKey"/>
    </Window.Resources>
    ...
Run Code Online (Sandbox Code Playgroud)

将此转换器设为global可能是一个更好的主意。这将使您不必在每个新的Window. 这也意味着您的转换器仅实例化一次,因此性能略有提高。

要实现这一点,请App.xaml改为定义转换器。

<Application ...
             xmlns:super="clr-namespace:WpfApplication1">
    <Application.Resources>
        <super:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverterKey"/>
    </Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)


O. *_*per 5

您通常将其放入周围对象的Resources属性中,在这种情况下,您的Window

<Window x:Class="WpfApplication1.Trigger"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:super="clr-namespace:WpfApplication1"
        Title="Trigger" Height="300" Width="300">
    <Window.Resources>
        <super:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverterKey"/>
    </Window.Resources>
    <Grid>
...
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 不要忘记使用适当的名称空间前缀。
  • 严格来说,这里发生的不仅是您在“定义密钥”;还包括 您要将转换器类的实例放入本地资源字典中,并将该实例分配给键。
  • 按照惯例,通常不会显式命名资源密钥... Key。可以这么说,在XAML文档的其余部分中,资源密钥存储在资源中的对象。你会说出性能动态返回某些键...按键(如各种的属性的SystemColors)。