Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在WPF中引用网格以更改属性_C#_Wpf - Fatal编程技术网

C#在WPF中引用网格以更改属性

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

您好,我是在VisualStudio中使用WPF和XAML制作应用程序的新手。所以我有一个网格,我想在代码中改变它的属性

我的网格属性:

<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)个理念:

  • 使用WPF的数据绑定功能将视图模型对象的属性连接到视图的控件,在视图的代码中编写尽可能少的代码,并将所有逻辑放在视图模型对象中
  • 将逻辑与显示分开,这样您就可以用其他结构替换视图,而无需更改逻辑

  • 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;
        }