Пользовательский контроль переключения между двумя стилями - PullRequest
2 голосов
/ 22 сентября 2011

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

Мой элемент управления содержит свойство зависимости для следующего перечисления:

public enum ControlTypes
{
    Basic,
    Advanced
}

Я создал два стиля в generic.xaml (с очень разными шаблонами) и дал каждому ключ.

Внутри обработчика изменений для свойства enum я пытаюсь найти стили и установить правильный.

private static void OnControlTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var myCustomControl = (MyCustomControl)d;

    var basicControlStyle = Application.Current.TryFindResource("BasicControlStyle") as Style;
    var advancedControlStyle = Application.Current.TryFindResource("AdvancedControlStyle") as Style;

    if (myCustomControl.ControlType == ControlTypes.Basic)
        myCustomControl.Style = basicControlStyle;
    else if (myCustomControl.ControlType == ControlTypes.Advanced)
        myCustomControl.Style = advancedControlStyle;            
}

Два стиля всегда нулевые. Я не уверен, как получить стили изнутри generic.xaml. Или есть лучший способ поменять мои стили?

1 Ответ

1 голос
/ 22 сентября 2011

Удалите код в OnControlTypePropertyChanged и вставьте что-то подобное в свой XAML. Обратите внимание, что я связал свойство IsAdvanced, потому что оно было проще для тестирования, но вы можете связать перечисление, изменив значение True для {x: Статическое пространство имен: nameofyourenum.Value}

<Style TargetType="local:SomeControl">
    <Style.Setters>
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:SomeControl">
                    <StackPanel>
                        <TextBlock Text="DefaultTemplate"></TextBlock>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
    <Style.Triggers>
        <Trigger Property="IsAdvanced" Value="True">
            <Trigger.Setters>
                <Setter Property="Control.Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="local:SomeControl">
                            <TextBlock Text="Advanced Template"></TextBlock>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger.Setters>
        </Trigger>
    </Style.Triggers>
</Style>

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

...