简体   繁体   中英

Add name to specific style control wpf

I have a custom contextmenu:

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

How would I be able to add a name to the Button so I can enable and disable it in my c# (without using binding), I have tried putting x:Name="" but it doesn't work, but if I add a button click it works? I am quite confused, any help would be appreciated!

I still say you should be doing this properly with data-binding, but if you insist...there are a couple of different ways to go about this.

Context menus aren't part of the regular visual tree, so you have to access them directly. Give your context menu a name, and then find the button by traversing its template's visual tree:

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

If your visual tree is particularly complex then a faster option would be to create a boolean resource in your window's resources block:

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

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

...and then bind your button to that dynamically:

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

This breaks your "no binding" rule though, which is why I was asking why you're so adamant about not using data-binding...you can still use it, even if you're not binding to the data context. In this scenario you set the value of that resource in your code instead:

this.Resources["ButtonEnabled"] = false;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM