2013-05-12 8 views
0

У меня есть UserControl, что у меня есть различные свойства, поэтому я могу настроить его для каждой копии, которая находится на экране. У меня есть путь, который использует заливку LinearGradientBrush. В настоящее время это жестко закодировано в XAML. У меня уже есть ширина и видимость управления траекторией в качестве объектов зависимостей и может легко модифицировать эти:WPF UserControl, создающий несколько вариантов размещения

<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» имеет синий цвет, но не имеет прозрачности и т. Д.

С видимостью Я вижу «видимые/скрытые/сложенные» как опции на выбор дизайн, и это то, что мне нужно.

Здесь я застрял. Я даже не знаю, как это будет вызвано, или как подойти к нему.

Любые указатели, в каком направлении я должен искать?

ответ

0

Вы можете использовать enum обеспечить фиксированные значения, которые вы хотите в Xaml, то вы можете использовать PropertyChangedCallback на этой enumDependencyProperty изменить 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 
} 

Xaml:

<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> 

Результат:

enter image description here

+0

Итак, я ошибся, думая, что у меня есть usercontrol, но у меня нет у меня ResourceDictionary, что у меня тогда есть элемент управления на основе. Я включил ваш код, который почти работает. Ресурсы BrushA/B/C не найдены. Если я опустил их на уровне страницы в качестве ресурсов страницы, тогда она компилируется, но не устанавливает цвет. Я помечаю ваш ответ как правильно, так как он работает с тем, что я спросил. Я виноват, что мои провода пересеклись. Можете ли вы посоветовать, где я должен помещать ресурсы SolidcolorBrush в словарь ресурсов? Большое спасибо за потраченное время. – MikeyTT

+0

Вы можете поместить кисти в любом месте вашего контроля, если вы используете только кисти на пути, которые вы можете разместить в или в родительском контейнере, если вы не используете UserControl, что используете, все FrameworkElements имеют свои собственные ресурсы –

+0

Спасибо. Я сделаю немного больше исследований в течение этого уик-энда и посмотрю, где он меня принимает. – MikeyTT

0

Одним из приятных функций, которые могут свести к минимуму ваши усилия по кодированию, являются: Визуальные состояния. Читайте о них here. Для этого есть и другие механизмы. Сочетание стилей, шаблонов и триггеров также будет работать, но затрудняет доступ к элементам пользовательского интерфейса в коде компонентов.

+0

Спасибо за это. Это, вероятно, поможет мне, когда я приду, чтобы сделать анимацию изображения, которую я планирую. – MikeyTT