Стиль панели инструментов Wpf CustomButton - PullRequest
0 голосов
/ 16 сентября 2010

Я создал UserControl для создания ImageButton. Но я заменил элемент UserControl на Button.

<Button x:Class="myimagebutton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:imagebutton">

    <Grid x:Name="grdButton">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Image Grid.Column="0"
               x:Name="btnImage"
               HorizontalAlignment="Left"
               VerticalAlignment="Center">
        </Image>
        <TextBlock Grid.Column="1"
                   TextWrapping="Wrap"
                   Text="{Binding Text}"
                   VerticalAlignment="Center"
                   Margin="2 0 2 0" />
    </Grid>
</Button>

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

If Me.Style Is Nothing AndAlso TypeOf Me.Parent Is ToolBar Then
   Me.Style = DirectCast(FindResource(ToolBar.ButtonStyleKey), Style)
End If

в моем Codebehind.

После этого я поместил свою кнопку на панель инструментов, а другую - на панель инструментов, чтобы проверить ее. Но кнопка всегда получает стиль по умолчанию. После отладки я узнаю, что Me.Parent - это всегда Ничто. Итак, теперь мой вопрос, как я могу получить информацию о том, находится ли моя кнопка на панели инструментов или нет?

1 Ответ

0 голосов
/ 12 февраля 2011

Мне трудно понять, что именно вы описываете, но после прочтения несколько раз, я думаю, я понимаю.

Прав ли я до сих пор?

Если да, то вам интересно, почему у вашей кнопки есть изображение

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

Я заменил элемент UserControl на кнопку

По сути то, что у вас естьdone создан новый элемент управления, который, вероятно, наследуется от Button.Вы могли бы начать с UserControl, но для замены корневого элемента в XAML вам также необходимо убедиться, что ваш тип myimagebutton также наследует от Button.Именно так работает XAML, и изучение того, как объяснить это таким образом, поможет людям понять, что вы делаете.

Обычно наследование от Button - это не то, как разработчики переопределяют визуальный стиль кнопки в WPF, главным образом потому, что WPF неНе поддерживается концепция того, что иногда называют визуальное наследование , а также существуют другие подходящие методы, которые можно использовать для решения проблемы другим способом.Вместо этого наследование в основном зарезервировано для случаев, когда поведенческие изменения или дополнения должны быть внесены в существующий класс управления.Это говорит о том, что есть способы симулировать визуальное наследование посредством использования элементов управления контентом, которые работают аналогично страницам с контентом и главным страницам в ASP.NET, но я думаю, что это немного выходит за рамки вашего примера.Кроме того, если вы хотите следовать модели наследования, вам необходимо убедиться, что в вашем коде вы задаете правильный стиль по умолчанию в статическом конструкторе, поэтому размещение кода для вашей кнопки также поможет.

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

element.SetResourceReference(FrameworkElement.StyleProperty, styleKey);
element.DefaultStyleKey = styleKey;

Кстати, в вашем случае, я считаю, что только вторая строка выполняется элементом управления ToolBar, и styleKey в этой точке определяется как ноль.

Теперь вместо того, чтобы наследовать от Button в первую очередь, вам, вероятно, будет лучшеВы можете просто создать новый ControlTemplate или DataTemplate для своей кнопки и назначить его свойству Template или ContentTemplate соответственно с помощью стиля.Таким образом, вы по-прежнему всегда имеете дело с кнопкой, а стиль - это то, что меняет визуальные свойства.

<Window x:Class="HeaderedContentControlTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="252"
        Width="372">
    <Window.Resources>
        <Style TargetType="{x:Type Label}">
            <Setter Property="Background"
                    Value="Orange" />
        </Style>

        <DataTemplate x:Key="ImageButtonDataTemplate">
            <Grid x:Name="grdButton">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>

                <Image Grid.Column="0"
                       HorizontalAlignment="Left"
                       VerticalAlignment="Center">
                </Image>
                <TextBlock Grid.Column="1"
                           TextWrapping="Wrap"
                           Text="{Binding}"
                           VerticalAlignment="Center"
                           Margin="2 0 2 0"
                           Background="Pink" />
            </Grid>
        </DataTemplate>

        <Style x:Key="ImageButtonStyle"
               TargetType="{x:Type Button}">
            <Setter Property="ContentTemplate"
                    Value="{StaticResource ImageButtonDataTemplate}" />
        </Style>

    </Window.Resources>
    <Grid Margin="11">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <ToolBar>
            <Button Style="{StaticResource ImageButtonStyle}"
                    Content="Some Text" />
        </ToolBar>

        <Button Grid.Row="1"
                Style="{StaticResource ImageButtonStyle}"
                VerticalAlignment="Center"
                HorizontalAlignment="Center"
                Content="Some Text" />
    </Grid>
</Window>

Использование ContentTemplate позволяет вам переопределить внутреннее содержимое кнопки, не теряя все специальное состояние кнопкипереходы и другие тонкости, которые вы обычно хотели бы сохранить.

См. этот связанный пост на форумах MSDN, в котором также объясняется аналогичное поведение при добавлении кнопок StackPanel на панель инструментов.

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