【问题标题】:Elements loaded via XamlReader() and from MainWindow.Xaml behave differently?通过 XamlReader() 和 MainWindow.Xaml 加载的元素表现不同?
【发布时间】:2017-12-23 16:47:28
【问题描述】:

我在 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"
                                  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>

在后面的代码中,我为 Polygon.Fill 属性定义了 2 个 RadialGradientBrushes:

public static RadialGradientBrush ledOn = new RadialGradientBrush();
public static RadialGradientBrush ledOff = new RadialGradientBrush();


  ledOn.GradientStops.Add(new GradientStop(Colors.Red, .8));
  ledOn.GradientStops.Add(new GradientStop(Colors.White, 0));
  ledOff.GradientStops.Add(new GradientStop(Colors.White, 2.5));
  ledOff.GradientStops.Add(new GradientStop(Colors.Black, 0));

如果我只从 MainWindow.xaml 加载视图框,我可以使用:

    R1C1LED.Fill = ledOn;

R1C1LED.Fill = ledOff;

并且填充按预期更改。如果我使用 XamlReader() 从文件中加载完全相同的 xaml,Viewbox 会完全按预期显示,但使用后面的代码更改填充,如上不会更改填充并且不会生成错误。

【问题讨论】:

    标签: c# wpf xaml xamlreader


    【解决方案1】:

    示例代码:

    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();
    
    }
    

    【讨论】:

    • 它存在,只是没有改变。正如我所说,不会产生任何错误。如果我尝试将值分配给空对象,则会产生错误。如果我使用 XamlWriter.Save(R1C1LED),无论我是否使用 FindName,生成的都是相同的。 Fill 属性不会随 R1C1LED.Fill = ledOn 改变。
    • 我更改了答案以向您展示您需要做什么。请注意缺少x:Class 属性。
    • 谢谢,我会试一试,让你知道结果如何。但请记住,我的 Window 和元素一样已经存在。我只是使用 Grid.Children.Add(element) 为每个元素(视图框)加载新值/属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2019-01-03
    相关资源
    最近更新 更多