C# 通过XamlReader()加载的元素和从MainWindow.Xaml加载的元素的行为是否不同?
我在MainWindow.Xaml中有以下Viewbox:C# 通过XamlReader()加载的元素和从MainWindow.Xaml加载的元素的行为是否不同?,c#,wpf,xaml,xamlreader,C#,Wpf,Xaml,Xamlreader,我在MainWindow.Xaml中有以下Viewbox: <Viewbox x:Name="R1C1Viewbox" Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1"> <Border x:Name="R1C1Border" BorderBrush="White" CornerRadius="3"
<Viewbox x:Name="R1C1Viewbox" Grid.Row="1" Grid.Column="2"
Grid.ColumnSpan="1" Grid.RowSpan="1">
<Border x:Name="R1C1Border" BorderBrush="White" CornerRadius="3"
BorderThickness="2" Background="White"
Height="40" Width="40" Margin="0,3,3,0">
<Grid x:Name="R1C1Grid">
<TextBlock x:Name="R1C1TextBlock1" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Arial" FontWeight="Bold" Text="+" FontSize="22"></TextBlock>
<Polygon x:Name="R1C1LED"
Points="0,0 15,0 0,15"
Stroke="#FFED1C24"
StrokeThickness="1">
<Polygon.Fill>
<RadialGradientBrush>
<GradientStop Color="White" Offset="2.5"/>
<GradientStop Color="Black"/>
</RadialGradientBrush>
</Polygon.Fill>
</Polygon>
<Button x:Name="R1C1Button" Background="Transparent"
BorderBrush="Transparent">
</Button>
</Grid>
</Border>
</Viewbox>
如果仅从MainWindow.xaml加载viewbox,则可以使用:
R1C1LED.Fill = ledOn;
或
填充也会按预期变化。如果我使用XamlReader()从文件中加载完全相同的xaml,则Viewbox将完全按照预期显示,但使用上述代码更改填充不会更改填充,也不会生成错误。示例代码:
private void OnTest(object sender, RoutedEventArgs e)
{
var xaml =
@"<Window
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:d='http://schemas.microsoft.com/expression/blend/2008'
xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'
mc:Ignorable='d'
Title='WPF App' Height='450' Width='800'>
<StackPanel Orientation='Vertical'>
<Button x:Name='R1C1LED' Content='Load Data' />
</StackPanel>
</Window>";
var win = (Window)XamlReader.Parse(xaml);
var button = (Button)win.FindName("R1C1LED");
button.Background = Brushes.Red;
button.Click += (obj, args) => { MessageBox.Show("Hi!"); };
win.Show();
}
private void-OnTest(对象发送方,RoutedEventArgs e)
{
var xaml=
@"
";
var win=(窗口)XamlReader.Parse(xaml);
var button=(button)win.FindName(“R1C1LED”);
button.Background=画笔.Red;
按钮。单击+=(对象,参数)=>{MessageBox.Show(“Hi!”);};
win.Show();
}
它存在,只是没有改变。正如我所说,不会产生错误。如果我试图给一个空对象赋值,它就会产生一个错误。如果我使用XamlWriter.Save(R1C1LED),无论我是否使用FindName,生成的都是相同的。Fill属性不会随着R1C1LED.Fill=ledOn而改变。我更改了答案,以向您展示需要修改的示例。请注意缺少x:Class
属性。谢谢,我将尝试一下,并让您知道它是如何工作的。但是请记住,我的窗口和元素一样已经存在。我只是使用Grid.Children.Add(element)将新值/属性加载到每个元素(viewbox)。
R1C1LED.Fill = ledOff;
private void OnTest(object sender, RoutedEventArgs e)
{
var xaml =
@"<Window
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:d='http://schemas.microsoft.com/expression/blend/2008'
xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'
mc:Ignorable='d'
Title='WPF App' Height='450' Width='800'>
<StackPanel Orientation='Vertical'>
<Button x:Name='R1C1LED' Content='Load Data' />
</StackPanel>
</Window>";
var win = (Window)XamlReader.Parse(xaml);
var button = (Button)win.FindName("R1C1LED");
button.Background = Brushes.Red;
button.Click += (obj, args) => { MessageBox.Show("Hi!"); };
win.Show();
}