如何从位于一个主窗口(C#/Xaml)中的另一个UserControl中双击/调用UserControl

本文关键字:UserControl Xaml 另一个 调用 双击 于一个 窗口 | 更新日期: 2023-09-27 18:26:05

我现在很困,我要解释我的问题和我想要什么。在我的解决方案中,我有一个主窗口,在该mainWindow中,我调用第一个位于用户控制库的用户控制。这是一份带按钮的菜单。我希望当我单击第一个用户控件的第一个按钮时,我希望将第二个用户控件可见性设置为可见(也位于用户控件库中)。但我尝试了很多东西,但没有一个有效。

第一个用户Control是UC_MenuSlider,而UC_Start_Study是单击第一个用户上的按钮后必须可见的第二个用户。启动时,UC_Start_Study被隐藏。

这是我的主窗口:代码的一部分

<Grid Name="MainGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <UserControlLibrary:UC_StartStudy x:Name="UC_Start_Study"  Grid.Column="1" Height="Auto" Width="Auto" Margin="70 0 0 0" Visibility="Hidden"/>
   <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.1*" MaxWidth="240" MinWidth="240" />
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <UserControlLibrary:UC_MenuSlider x:Name="UC_MenuSlider"  Grid.Column="0"/>
   </Grid>
</Grid>

我的第一个UserControl(UC_MenuSlider):的一部分代码

<Grid Name="Grid_Menu" HorizontalAlignment="Stretch">
    <Grid.RowDefinitions>
     <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Button x:Name="Start_Study"   Grid.Row="0" Grid.Column="0"  Margin="0" Content="Start Study" FontSize="16" Click="Start_Study_Click">
    </Button>
</Grid>

一开始是一个基本事件,只是我的第一个userControl中的一个事件点击。后面的代码是这样的:

public void Start_Study_Click(object sender, RoutedEventArgs e)
{
    var startStudy = new UserControlLibrary.UC_StartStudy();
    startStudy.Visibility = Visibility.Visible;
}

不起作用。然后我使用"RoutedEvent",但我真的不明白它是谁用的。

我希望我的问题足够清楚,提前感谢您的回答

如何从位于一个主窗口(C#/Xaml)中的另一个UserControl中双击/调用UserControl

问题是因为您正在创建一个新的UC_StartStrudy并将其Visibility设置为Visible。您真正需要的是设置XAML:UC_Start_Study 中的Visibility

public void Start_Study_Click(object sender, RoutedEventArgs e)
{
   UC_Start_Study.Visibility = Visibility.Visible;
}

您还可以使用XAML数据绑定UC_StartStrudyVisibility属性,并在代码中设置其值:

XAML:

<Window.Resourses>
     <BooleanToVisibilityConverter x:Key="BooltoVisible" />
</Window.Resourse>
.....
<UserControlLibrary:UC_StartStudy x:Name="UC_Start_Study"  Grid.Column="1" Height="Auto" Width="Auto" Margin="70 0 0 0" Visibility="{Binding IsUCStartStudyVisible,  Converter={StaticResource BooltoVisible}}"/>

代码(记得执行INotifyPropertyChanged):

//implement INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChange(String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
//property for data binding
private bool _isucstartstudyvisible = false;
public bool IsUCStartStudyVisible
{
   get{return _isucstartstudyvisible;}
   set{_isucstartstudyvisible=value; RaisePropertyChange("IsUCStartStudyVisible");}
}
//your event to change the visibility
public void Start_Study_Click(object sender, RoutedEventArgs e)
{
   IsUCStartStudyVisible=true;
}

我不明白你为什么要使用UC_StartStudy()的新实例,因为你已经在主窗口中添加了它。

难道你不能简单地将UC_Start_Study的可见性设置为在代码中可见吗。

让我来教你怎么做。尝试

  public void Start_Study_Click(object sender, RoutedEventArgs e)
        {
              this.UC_Start_Study.Visibility = Visibility.Visible;
        }