Добавить имя к указанному c стиль управления wpf - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть пользовательское контекстное меню:

<Window.Resources>
    <ContextMenu  x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
        <ContextMenu.Style>
            <Style TargetType="ContextMenu">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Grid Background="Transparent">
                                <Border Background="#1c1c1c" Height="70" Width="170" CornerRadius="10">
                                    <StackPanel Orientation="Vertical">
                                        <Button x:Name="openinBrowser" Click="Button_Click_1">
                                            <Grid Width="170">
                                                <materialDesign:PackIcon Kind="OpenInApp" VerticalAlignment="Center" Foreground="{StaticResource PrimaryHueMidBrush}" HorizontalAlignment="Left"/>
                                                <Label FontFamily="Champagne &amp; Limousines" Content="Action 1" FontSize="7" HorizontalAlignment="Center" Foreground="LightGray" VerticalAlignment="Center"/>
                                            </Grid>
                                            <Button.Style>
                                                <Style BasedOn="{StaticResource MaterialDesignRaisedAccentButton}" TargetType="Button">
                                                    <Setter Property="Background" Value="Transparent"/>
                                                    <Setter Property="BorderBrush" Value="{StaticResource PrimaryHueMidBrush}"/>
                                                    <Setter Property="BorderThickness" Value="0"/>
                                                </Style>
                                            </Button.Style>
                                        </Button>
                                    </StackPanel>
                                </Border>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ContextMenu.Style>
    </ContextMenu>

</Window.Resources>

Как мне добавить имя к кнопке, чтобы я мог включить и отключить его в своем c# (без использования привязки), у меня есть попытался поставить x:Name="", но это не работает, но если я добавляю кнопку, она работает? Я в замешательстве, любая помощь будет признательна!

1 Ответ

1 голос
/ 09 февраля 2020

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

Контекстные меню не являются частью обычного визуального дерева, так что вы должны получить к ним доступ напрямую. Дайте вашему контекстному меню имя, а затем найдите кнопку, пройдя по визуальному дереву его шаблона:

// button has to be templated in order for this to work,
// so don't try it in the parent window's constructor
// (add a this.contextMenu.Loaded handler instead if you have to)
var button = this.contextMenu.Template.FindName("openinBrowser", this.contextMenu) as Button;

Если ваше визуальное дерево особенно сложное, то более быстрым вариантом будет создание логического ресурса в ресурсах вашего окна. block:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

<Window.Resources>
    <sys:Boolean x:Key="ButtonEnabled">True</sys:Boolean>
</Window.Resources>

... и затем динамически привязывайте свою кнопку к этому:

<Button x:Name="openinBrowser" IsEnabled="{DynamicResource ButtonEnabled}">

Это нарушает ваше правило "без привязки", поэтому я спрашивал, почему вы Вы так непреклонны в том, что не используете привязку данных ... вы все равно можете использовать ее, даже если не привязываетесь к контексту данных. В этом сценарии вместо этого вы устанавливаете значение этого ресурса в своем коде:

this.Resources["ButtonEnabled"] = false;
...