Есть ли способ изменить шаблон элемента управления на основе шаблона по умолчанию? - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь внести несколько незначительных изменений в шаблон по умолчанию для флажка. Теперь я понимаю, как сделать новый шаблон с нуля, но этого я не знаю. Мне удалось (я думаю?) Извлечь шаблон по умолчанию с помощью метода здесь .

И выплюнуло:

    <ControlTemplate TargetType="CheckBox" 
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                     xmlns:s="clr-namespace:System;assembly=mscorlib" 
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                     xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna">
        <BulletDecorator Background="#00FFFFFF" SnapsToDevicePixels="True">
            <BulletDecorator.Bullet>
                <mwt:BulletChrome Background="{TemplateBinding Panel.Background}" 
                                  BorderBrush="{TemplateBinding Border.BorderBrush}" 
                                  BorderThickness="{TemplateBinding Border.BorderThickness}" 
                                  RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
                                  RenderPressed="{TemplateBinding ButtonBase.IsPressed}" 
                                  IsChecked="{TemplateBinding ToggleButton.IsChecked}" />
            </BulletDecorator.Bullet>
            <ContentPresenter RecognizesAccessKey="True" 
                              Content="{TemplateBinding ContentControl.Content}" 
                              ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
                              ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
                              Margin="{TemplateBinding Control.Padding}" 
                              HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                              VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                              SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
        </BulletDecorator>
        <ControlTemplate.Triggers>
            <Trigger Property="ContentControl.HasContent">
                <Setter Property="FrameworkElement.FocusVisualStyle">
                    <Setter.Value>
                        <Style TargetType="IFrameworkInputElement">
                            <Style.Resources>
                                <ResourceDictionary />
                            </Style.Resources>
                            <Setter Property="Control.Template">
                                <Setter.Value>
                                    <ControlTemplate>
                                        <Rectangle Stroke="#FF000000" 
                                                   StrokeThickness="1" 
                                                   StrokeDashArray="1 2" 
                                                   Margin="14,0,0,0" 
                                                   SnapsToDevicePixels="True" />
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Setter.Value>
                </Setter>
                <Setter Property="Control.Padding">
                    <Setter.Value>
                        <Thickness>2,0,0,0</Thickness>
                    </Setter.Value>
                </Setter>
                <Trigger.Value>
                    <s:Boolean>True</s:Boolean>
                </Trigger.Value>
            </Trigger>
            <Trigger Property="UIElement.IsEnabled">
                <Setter Property="TextElement.Foreground">
                    <Setter.Value>
                        <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" />
                    </Setter.Value>
                </Setter>
                <Trigger.Value>
                    <s:Boolean>False</s:Boolean>
                </Trigger.Value>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

Хорошо, конечно, выглядит просто отлично, наверное. У меня нет достаточного опыта, чтобы знать, похоже это правильно или нет. Теперь я получаю две ошибки:

Сборка 'PresentationFramework.Luna' не был найден. Убедитесь, что вы не отсутствует ссылка на сборку. Также, убедитесь, что ваш проект и все ссылочные сборки были построены.

и

Тип 'mwt: BulletChrome' не был найденный. Убедитесь, что вы не пропали ссылка на сборку и что все ссылочные сборки были построены.

Теперь мне интересно, как я могу устранить эти ошибки, чтобы я мог начать работать над шаблоном? Есть ли лучший способ сделать это? Мой босс хочет установить флажок с тремя состояниями с красным квадратом вместо зеленого, и он не примет ответ «нет».

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

Единственный способ изменить части существующего шаблона - полностью переопределить его (копию). Вы можете легко сделать это (и он будет скомпилирован сразу - нет необходимости ссылаться на что-либо вручную) с помощью выражения Blend ( Редактировать шаблон-> Редактировать копию ).

Есть одна вещь, которую вы должны помнить с ControlTemplates:

Для каждой известной темы ОС (Luna, Aero и т. Д.) Существует отдельный шаблон ControlTemplate, поэтому элемент управления будет выглядеть корректно для каждой темы ОС. Если вы переопределите его, это больше не так, и он всегда будет выглядеть одинаково для каждой темы в каждой ОС. В вашем случае он всегда будет выглядеть как Windows XP Luna (потому что вы выбрали Luna ControlTemplate в качестве отправной точки), даже если вы запускаете свое приложение в Vista, Win7 или в Battleship-Grey-Theme.

Так что в некоторой степени переопределение шаблонов ControlTemplates имеет недостатки. Конечно, вы можете самостоятельно создать ControlTemplate для каждой известной темы ОС, но это не поможет, если появятся новые.

2 голосов
/ 25 мая 2010

Чтобы устранить эти две ошибки, добавьте ссылку на PresentationFramework.Luna (она находится в GAC, поэтому вы найдете ее на вкладке .NET при выборе «Добавить ссылку в VS»).

Однако обратите внимание, что тема Luna будет использоваться по умолчанию только в том случае, если для Windows XP используется тема Luna (по умолчанию). Если вы измените тему в настройках дисплея, ваш флажок сохранит тему Luna, поскольку вы повторно используете шаблон Luna.

Нет другого способа редактировать только часть существующего шаблона, если упомянутый шаблон не был спроектирован как таковой.

0 голосов
/ 25 мая 2010

Нет ли полных копий всех шаблонов элементов управления, включенных в Windows SDK?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...