0

我有一个定义了各种属性的 UserControl,因此我可以为屏幕上的每个副本自定义它。我有一个使用 LinearGradientBrush 填充的路径。目前,这被硬编码到 XAML 中。我已经将路径控件的宽度和可见性作为依赖对象,并且可以轻松地修改这些:

<Path 
    Visibility="{TemplateBinding PathAVisibility}"
    Width="{TemplateBinding PathALength}">
        <LinearGradientBrush EndPoint="0,0.5" MappingMode="RelativeToBoundingBox" StartPoint="1,0.5">
            <GradientStop Color="#07FFFFFF" Offset="0.812"/>
            <GradientStop Color="Red"/>
            <GradientStop Color="#00000000" Offset="0.993"/>
            <GradientStop Color="#FF956666" Offset="0.62"/>
        </LinearGradientBrush>...

我想做的是创建一些渐变作为选项,然后我可以在 WPF XAML 设计器中选择它们作为属性。像“GradA”这样的东西是红色的,“GradB”是蓝色的,但没有透明度,等等。

通过可见性,我可以在设计视图中看到“可见/隐藏/折叠”作为可供选择的选项,这就是我所追求的。

这就是我卡住的地方。我什至不知道这会被称为什么,或者如何处理它。

关于我应该看哪个方向的任何指示?

4

2 回答 2

0

您可以使用 anenum来提供您想要的固定值Xaml,然后您可以使用PropertyChangedCallbackon 那enum DependencyProperty来更改Brush.

这是一个非常简单的例子。

代码:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
        DataContext = this;
    }

    public BrushType BrushType
    {
        get { return (BrushType)GetValue(BrushTypeProperty); }
        set { SetValue(BrushTypeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for BrushType.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BrushTypeProperty =
        DependencyProperty.Register("BrushType", typeof(BrushType), typeof(UserControl1)
        , new PropertyMetadata(BrushType.None, new PropertyChangedCallback(OnBrushTypeChanged)));

    private static void OnBrushTypeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var userControl = d as UserControl1;
        if (e.NewValue is BrushType)
        {
            userControl.MyBrush = userControl.FindResource(e.NewValue.ToString()) as Brush;
        }
    }

    public Brush MyBrush
    {
        get { return (Brush)GetValue(MyBrushProperty); }
        set { SetValue(MyBrushProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyBrush.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyBrushProperty =
        DependencyProperty.Register("MyBrush", typeof(Brush), typeof(UserControl1), new PropertyMetadata(null));

}

public enum BrushType
{
    None,
    BrushA,
    BrushB,
    BrushC
}

xml:

<UserControl x:Class="WPFListBoxGroupTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <SolidColorBrush x:Key="BrushA" Color="Red" />
        <SolidColorBrush x:Key="BrushB" Color="Yellow" />
        <SolidColorBrush x:Key="BrushC" Color="Blue" />
    </UserControl.Resources>

    <Grid Background="{Binding MyBrush}" />

</UserControl>

用法:

<StackPanel Orientation="Horizontal">
    <local:UserControl1 BrushType="BrushA" />
    <local:UserControl1 BrushType="BrushB" />
    <local:UserControl1 BrushType="BrushC" />
</StackPanel>

结果:

在此处输入图像描述

于 2013-05-13T00:07:23.040 回答
0

一个很好的功能可以最大程度地减少您的编码工作量是Visual States在这里阅读它们。还有其他机制可以实现这一点。样式、模板和触发器的组合也可以工作,但会使访问组件代码中的 UI 元素变得更加困难。

于 2013-05-13T06:05:48.730 回答