How can you unhide a Button inside a UserControl when a Page loads into a Frame on the MainWindow?

Michael Bahr 20 Reputation points
2025-02-27T17:55:20.3+00:00

UserControl:

<UserControl x:Class="Scores.Views.UserControls.MenuBar"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:pages="clr-namespace:Scores.Views.Pages" 
    xmlns:local="clr-namespace:Scores.Views.UserControls" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    mc:Ignorable="d" 
    HorizontalAlignment="Stretch" 
    Height="70" d:DesignWidth="900">

    <Grid>  
        <Grid.RowDefinitions> 
            <RowDefinition Height="30" />
            <RowDefinition Height="40" />
        </Grid.RowDefinitions>
        <Menu>
            <MenuItem Header="File" FontSize="14">
                <MenuItem Name="btnExit" Header="Exit" Click="btnExit_Click"/>
            </MenuItem>
            <MenuItem Header="Create" FontSize="14"/>
            <MenuItem Header="Config" FontSize="14"/>
            <MenuItem Header="Database" FontSize="14"/>
            <MenuItem Header="Help" FontSize="14"/>
        </Menu>
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Button Name="btnBack" Style="{DynamicResource ButtonStyleNoHover}"
                Width="60" ToolTip="Back"
                BorderThickness="0,0,0,0"  Grid.Column="5" Margin="3"
                Click="btnBack_Click" 
                Visibility="{Binding ElementName=MenuBar, Path=btnBackVisibility, Mode=TwoWay}">
                <Button.Background>
                    <ImageBrush ImageSource="/Views/images/left.png" Stretch="Uniform"/>
                </Button.Background>
            </Button>
            <Button Style="{DynamicResource ButtonStyleNoHover}" Name="btnNext"                
                Width="60" ToolTip="Back"
                BorderThickness="0,0,0,0"  Grid.Column="6" Margin="3"
                Click="btnNext_Click"
                Visibility="{Binding ElementName=MenuBar, Path=btnNextVisibility}">
               <Button.Background>
                    <ImageBrush ImageSource="/Views/images/right.png" Stretch="Uniform"/>
               </Button.Background>
            </Button>
        </Grid>
    </Grid>
</UserControl>

UserControl Code Behind:

namespace Scores.Views.UserControls
{
    public partial class MenuBar : UserControl
    {
        public MenuBar()
        {
            InitializeComponent();
            this.DataContext = this;
            MenuBar.VisibilityProperty.OwnerType.GetField("btnBack");
            MenuBar.VisibilityProperty.OwnerType.GetField("btnNext");
            btnBackVisibility = Visibility.Hidden;
            btnNextVisibility = Visibility.Hidden;
        }
        public static readonly RoutedEvent ClickBkEvent = EventManager.RegisterRoutedEvent("ClickBk", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuBar));
        public static readonly RoutedEvent ClickNxEvent = EventManager.RegisterRoutedEvent("ClickNx", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuBar));
        public event RoutedEventHandler ClickBk;
        public event RoutedEventHandler ClickNx;
        public Visibility btnBackVisibility
        {
            get { return (Visibility)GetValue(btnBackVisibilityProperty); }
            set { SetValue(btnBackVisibilityProperty, value); }
        }
        public static DependencyProperty btnBackVisibilityProperty =
            DependencyProperty.Register("btnBackVisibility", typeof(Visibility), typeof(MenuBar), new PropertyMetadata(Visibility.Visible));
        public Visibility btnNextVisibility
        {
            get { return (Visibility)GetValue(btnNextVisibilityProperty); }
            set { SetValue(btnNextVisibilityProperty, value); }
        }
        public static DependencyProperty btnNextVisibilityProperty =
            DependencyProperty.Register("btnNextVisibility", typeof(Visibility), typeof(MenuBar), new PropertyMetadata(Visibility.Visible));
        private void btnBack_Click(object sender, RoutedEventArgs e)
        {
            if (ClickBk != null)
            {
                ClickBk(this, e);
            }
        }
        private void btnNext_Click(object sender, RoutedEventArgs e)
        {
            if (ClickNx != null)
            {
                ClickNx(this, e);
            }
        }
    }
}

MainWindow:

<Window x:Class="Scores.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Scores"
        xmlns:UserControls="clr-namespace:Scores.Views.UserControls"
        xmlns:UserPages="clr-namespace:Scores.Views.Pages"
        mc:Ignorable="d"
        Height="680" Width="1010"
        Title="ScoreCards"
        WindowStyle="None" 
        ResizeMode="CanResize" AllowsTransparency="False">
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="70" />
            <RowDefinition Height="*" />
            <RowDefinition Height="20" />
        </Grid.RowDefinitions>

        <UserControls:MenuBar x:Name="uCtrl" ClickBk="btnMove_Click" ClickNx="btnMove_Click"/>
        
        <Grid Grid.Row="1" Grid.RowSpan="2">
            <Frame Name="PageFrame" Height="Auto" Margin="0,0,0,60"></Frame>
        </Grid>
        <Grid Grid.Row="2" Background="#0000FF" Height="20" 
            VerticalAlignment="Top">
            <TextBlock Name="txtBlk"
                VerticalAlignment="Center" HorizontalAlignment="Center"
                FontSize="8" Text="XXXXXXXXXXX"
                Foreground="#FFFFFF" FontWeight="Bold" 
                Grid.Row="3"/>
            <Image Source="/Views/images/logo.png" Stretch="Uniform" 
                Width="15"
                Grid.Row="2" Grid.Column="0"/>
        </Grid>
    </Grid>
</Window>

My XAML Page Code Behind being loaded:


public PageOutput()
{
    InitializeComponent();
    dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName;
    pName = Assembly.GetCallingAssembly().GetName().Name;
    xmlFile = dir + "\\" + pName + "\\Views\\data\\Teams.xml";

    // This is where I want to unhide the two Button Controls inside my UserControl MenuBar...
    //     btnBack and btnNext 
    //
    // Here is what I have tried so far:
    //
    //    MenuBar.btnBackVisibilityProperty = Visibility.Visible;
    //      
    //    MenuBar.btnBackVisibilityProperty = SetValue(MenuBar.btnBackVisibilityProperty, value:          
          Visibility.Visible);
}
    // ...

}
Windows Presentation Foundation
Windows Presentation Foundation
A part of the .NET Framework that provides a unified programming model for building line-of-business desktop applications on Windows.
2,833 questions
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Viorel 120.1K Reputation points
    2025-02-27T18:36:15.6533333+00:00

    Inside of the MainWindow, try this: uCtrl.btnBackVisibility = Visibility.Visible.

    Also add the name to User Control: <UserControl x:Name="menuBar" ....

    And adjust the binding of btnBack: Visibility="{Binding ElementName=menuBar, ....

    In WPF this should work.


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.