2014-10-10 46 views
0

我现在很坚持,我会解释我的问题和我想要的。 在我解决方案我有一个主窗口,在主窗口我打电话第一用户控件谁坐落在一个userControlLibrary。我有一个按钮菜单。我希望当我在第一个用户控件的第一个按钮点击,我希望把知名度第二用户控件的可见(也位于userControlLibrary)。但我尝试了很多东西,但没有人工作。如何从一个MainWindow(C#/ Xaml)中的两个位置点击另一个UserControl来显示/调用UserControl

第一个用户控件UC_MenuSliderUC_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> 

我的第一用户控件(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',但我并不真正了解它的工作原理。

我希望我的问题是不够清楚,在此先感谢您的anwsers

+1

最可靠的就是使用* binding *。在'UserControl1'中提供一个依赖属性,该值应该控制'UserControl2'的可见性,绑定'UserControl2'的可见性(如果你使用'bool',那么你必须使用转换器,参见[this](http:// stackoverflow .com/q/7000819/1997232)问题)。 – Sinatr 2014-10-10 09:02:53

+0

好吧,我要去看看这个谢谢 – 2014-10-10 09:06:17

回答

0

的问题是,因为你正在创建一个新的UC_StartStrudy并设置其VisibilityVisible。你真正需要的是设置一个VisibilityXAMLUC_Start_Study

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; 
} 
+0

我有一个RaisePropertyChange的问题,它是如何工作的? – 2014-10-10 13:07:08

+0

@ Unkle-Wik,你需要实现['INotifyPropertyChanged'](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v = vs.110).aspx)查看我的更新回答。 – Bolu 2014-10-10 13:22:07

0

我不明白你为什么要采用UC_StartStudy()的新实例,因为你已经在你的MainWindow中添加了这个实例。

难道你不能简单地把UC_Start_Study的可见性变成代码中可见的。

让我告诉你如何做到这一点。 尝试

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