C#在WPF中引用网格以更改属性
您好,我是在VisualStudio中使用WPF和XAML制作应用程序的新手。所以我有一个网格,我想在代码中改变它的属性 我的网格属性:C#在WPF中引用网格以更改属性,c#,wpf,C#,Wpf,您好,我是在VisualStudio中使用WPF和XAML制作应用程序的新手。所以我有一个网格,我想在代码中改变它的属性 我的网格属性: <Grid HorizontalAlignment="Left" Height="603" Margin="0,51,0,0" x:Name="usersPan" VerticalAlignment="Top" Wi
<Grid HorizontalAlignment="Left"
Height="603"
Margin="0,51,0,0"
x:Name="usersPan"
VerticalAlignment="Top"
Width="1286">
当我尝试这样做时,^它表示userPan的引用为空
谢谢,我不知道为什么网格在代码隐藏中是不可见的,但您可以使用事件访问它的属性(但不要认为它是完美的解决方案) 例如,添加到您的网格事件
Loaded
<Grid HorizontalAlignment="Left"
Height="603"
Margin="0,51,0,0"
x:Name="usersPan"
VerticalAlignment="Top"
Width="1286"
Loaded="FrameworkElement_OnLoaded">
更好的解决方案: 向ViewModel添加一些布尔属性,如
public bool IsGridVisible{get;set;}
并将其绑定到网格上
<Grid HorizontalAlignment="Left"
Height="603"
Margin="0,51,0,0"
x:Name="usersPan"
VerticalAlignment="Top"
Width="1286"
Visibility="{Binding Path=IsGridVisible, Converter={StaticResource BoolToVis}">
其中BoolToVis是将真转换为可见,将假转换为隐藏的转换器。您可以在App.xaml中定义它,如下所示:
<BooleanToVisibilityConverter x:Key="BoolToVis" />
nooooooo,永远不要那样做。创建一个绑定到栅格的“宽度”属性的ViewModel,然后仅更改该值 我怀疑你根本不需要这个。查看容器,以及如何定位它们 在这几年中,我很少需要这样做,我想你不需要这样做。告诉我你在做什么 编辑: 您有一个需要实现NotifyPropertyChanged接口的VM(这里我不会这么做,在hoew上有很多这样做的示例) 将选中相应的选项卡 编辑: 我还建议您使用MVVM通知。
另外,在绑定方面,我可以建议您使用WPF inspector。一个方便的小工具我可以这样做,这样我就可以在事件之外更改属性
private Grid userGrid;
private void onUserGridLoaded(object sender, RoutedEventArgs e)
{
userGrid = sender as Grid;
}
编写WPF程序的最佳方法是使用MVVM(模型-视图-模型)设计模式。MVVM背后有两(2)个理念:
MVVM本身就是一个巨大的话题。有很多关于它的文章,以及可以用来构建程序的框架。例如,查看MVVM Light。您的
PAN_大小是什么类型的
?是否在调用InitializeComponent()之前调用代码代码>方法?谢谢你的快速回复,我现在正朝着正确的方向前进。为什么人们总是发布这样的答案,把这个家伙推入深渊,他需要意识到自己走错了路,需要了解WPF和MVVM@user853710,正如我在回答中所写,这不是完美的解决方案。不是完美的吗?这是最坏的可能!!!别给他鱼,教他钓鱼。我对此有点激动,因为我不得不维护一个项目,这个家伙开始喜欢这个项目,后来辞职了。目标是让一个网格消失,这样我就可以看到其他网格。因此,我可以做一些类似于表单中的选项卡控件的事情。您在WPF中内置了一个选项卡控件。创建TabViewModels列表并将其绑定到TabView控件。然后在Viewmodel中,您说选择了哪个Viewmodel对象,WPF将通过选择所需的选项卡进行反应。WPF和MVVM是反应的。您更改数据,它将对数据作出反应。在XAML中,你只会说它的反应方式。我应该做一些研究,哈哈。我可以让单选按钮也做同样的事情,看起来也不太糟糕。不管你做了与否。如果你做了。。。。改变它。首先阅读一些关于WPF及其名为MVVM的设计模式的内容。可能看起来像是一笔开销,但相信我,你会很高兴你这么做的。这不必要。您为网格
控件指定了一个名称;调用InitializeComponent()
后,您应该能够使用代码隐藏中的名称更改其属性。此外,请确保每个地方的名称拼写一致。案件数!
<BooleanToVisibilityConverter x:Key="BoolToVis" />
public class MainVM
{
public ObservableCollection<TabVM> TabsVms {get;set;}
public int SelectedIndex {get;set}
}
<TabControl DataContext={TabsVMs} SelectedIndex="{Binding SelectedIndex}">
...
</TabControl>
var TabsVMs = new ObservableCollection<TabVM>();
TabsVMs.add(new TabVM());
TabsVMs.add(new TabVM());
TabsVMs.add(new TabVM());
MainVm.SelectedIndex = 1
private Grid userGrid;
private void onUserGridLoaded(object sender, RoutedEventArgs e)
{
userGrid = sender as Grid;
}