WPF VB.NET:从MainWindow修改运行时加载的UserControl网格背景问题
解决MainWindow修改嵌入UserControl中Grid背景色的问题
问题分析
先拆解你遇到的两个问题:
- 第一个写法报错「Reference to a non-shared member requires an object reference」:这是因为你直接用
UserControl1.grid1访问控件——UserControl1是类名,而grid1是属于类实例的成员,不是静态(共享)成员,必须通过具体的对象实例才能访问。 - 第二个写法编译通过但没效果:
Application.Current.Windows.OfType(Of BuildUIContainer).FirstOrDefault是在找窗口对象,但你的UserControl是嵌入在MainWindow里的控件,不是独立窗口,所以这个查询要么找不到正确的实例,要么拿到的不是你要修改的那个UserControl,自然背景色不会变。
正确解决方案
核心思路:在MainWindow中保存你嵌入的那个UserControl的实例引用,然后通过这个实例访问内部的Grid。
步骤1:保存UserControl实例引用
在MainWindow的类中声明一个成员变量,用来存储加载时创建的UserControl实例:
' MainWindow类的成员变量 Private myUserControl As UserControl1 ' 在MainWindow加载时创建并嵌入UserControl的代码里 Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded myUserControl = New UserControl1() ' 假设你把UserControl加到MainWindow的某个容器(比如名为mainContainer的Grid/Panel)里 mainContainer.Children.Add(myUserControl) End Sub
步骤2:确保UserControl内的Grid可访问
默认情况下,XAML中命名的控件(比如grid1)的访问修饰符是Private,MainWindow无法直接访问。你需要修改它的访问级别:
- 在XAML中修改:
<Grid x:Name="grid1" x:FieldModifier="public"> <!-- Grid内容 --> </Grid>
- 或者在UserControl的代码后台修改:
Public grid1 As Grid
步骤3:在按钮点击事件中修改背景色
现在可以直接通过保存的实例访问grid1并修改背景:
Sub button_click(sender As Object, e As RoutedEventArgs) Handles button.click If myUserControl IsNot Nothing Then myUserControl.grid1.Background = CType(FindResource(AdonisUI.Brushes.Layout4BackgroundBrush), Brush) End If End Sub
更优雅的封装写法(推荐)
如果不想把grid1暴露为公共成员,可以在UserControl1中添加一个公共方法,用来设置背景色,这样更符合面向对象的封装原则:
' UserControl1类中的代码 Public Sub SetGridBackground(backgroundBrush As Brush) grid1.Background = backgroundBrush End Sub
然后在MainWindow的按钮点击事件中调用这个方法:
Sub button_click(sender As Object, e As RoutedEventArgs) Handles button.click If myUserControl IsNot Nothing Then Dim targetBrush = CType(FindResource(AdonisUI.Brushes.Layout4BackgroundBrush), Brush) myUserControl.SetGridBackground(targetBrush) End If End Sub
内容的提问来源于stack exchange,提问作者Somanna
相关产品推荐
相关产品推荐

