【问题标题】:Access a border from XAML inC#从 XAML inC# 访问边框
【发布时间】:2018-01-04 16:25:13
【问题描述】:

如何在 C# 代码中访问 XAML 文件的边框? 搜索了一下,没找到,对WPF有点陌生,所以不知道怎么实现概念。

我想在 C# 中更改此元素的背景颜色。

谢谢

编辑

这是完整的代码

<Button x:Name="btnSNUcenik" Click="btnSNUcenik_Click">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <DockPanel Width="215" Cursor="Hand">
                        <DockPanel.Style>
                            <Style TargetType="{x:Type DockPanel}">
                                <Setter Property="Background" Value="#2B303D"/>
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="Background" Value="#242631"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </DockPanel.Style>

                        <!-- right here -->
                        <Border x:Name="brdrSNUcenik" Padding="10" HorizontalAlignment="Center" Width="148">
                            <Label Content="Ucenik" Foreground="Gray" FontSize="15" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" VerticalAlignment="Center" Margin="19,0,0,0"/>
                        </Border>
                        <Border Padding="10" HorizontalAlignment="Right">
                            <Border Padding="9" Background="#242631">
                                <Image x:Name="icons8_Graduation_Cap_48px_png" Height="25" Source="Images/icons8_Graduation_Cap_48px.png" Stretch="Fill" Width="25"/>
                            </Border>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Button.Template>
        </Button>

【问题讨论】:

  • 这是什么?文本框代码在哪里?
  • 我想你会发现你的视图类中有一个变量叫做brdrSNUcenik,你可以在代码中改变它。
  • @Neli 我试过了,它给了我一个 brdrSNUcenik 未定义的错误。
  • brdrSNUcenik 在模板内。这意味着您不能简单地通过在后面的代码中输入名称来访问它,因为在运行时会创建多个边框实例。要更改边框颜色,请查看动态资源!
  • 可以访问它,但不是直截了当。您需要在运行时浏览可视化树,如@AlexPaven 答案中所述。

标签: c# .net wpf visual-studio


【解决方案1】:

据我所知,您需要导航可视化树才能找到边框,您无法直接访问模板的内容。请参阅https://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper(v=vs.110).aspx - 使用 GetChild 和 GetChildrenCount,您可以深入查看可视化树并检查边框,直到找到您想要的对象(我想从按钮开始)。我不确定是否有更简单的解决方案(当然您可以编写自己的辅助方法或扩展方法以使其更容易)。

【讨论】:

  • 谢谢,我稍后试试。听起来对我来说是一个解决方案,目前
【解决方案2】:

要完成@Alex Paven 的回答,因为这也是我过去一直在努力解决的问题。我需要强制 ComboBox 的 ScrollViewer 具有零垂直偏移,但事实并非如此,并且在处理大尺寸列表时非常不舒服。 通过在 generic.xaml 文件中检查 ComboBox 的模板并使用 VisualTreeHelper 类,我可以进入 ScrollViewer 并强制事件更改它的视图。

您必须执行几乎相同的过程,但您将引用自己的模板,而不是 generic.xaml 文件中定义的默认模板。

只需几行代码,即可帮助您。

int count = VisualTreeHelper.GetChildrenCount(myControl);
for (int i = 0; i < count; i++)
{
   DependencyObject current = VisualTreeHelper.GetChild(myControl, i);

   // lets say you have to transverse over a Grid
   if (current.GetType().Equals(typeof(Grid)))
   {
       int count2 = VisualTreeHelper.GetChildrenCount(current);
       for(int k=0; k < count2 ; k++)
       {
          DepedencyObject currentX = VisualTreeHelper.GetChild(current, k)

          .....
          // Keeping transversing the Tree
          .....

          if(currentX.GetType().Equals(typeof(Border))
          {
             Border border = (Border)currentX;
             Border.Background = .... 
          }
       }
   }
}

【讨论】:

    【解决方案3】:

    正如@Alex Paven 建议和@André B 让我进入 VisualTreeHelper 课程,经过几个小时的配置,我终于完成了我需要的东西。我的问题的完整代码是:

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(this.spSideNav); i++) // in sidenav stack panel
            {
                    DependencyObject current = VisualTreeHelper.GetChild(this.spSideNav, this.currentlyActive + 1);
                    if (current.GetType().Equals(typeof(Button)))
                    {
                        Button btn = (Button)current;
                        btn.Background = Brushes.DarkBlue;
                        for (int j = 0; j < VisualTreeHelper.GetChildrenCount(current); j++) // in button
                        {
                            current = VisualTreeHelper.GetChild(current, j);
                            if (current.GetType().Equals(typeof(Border)))
                            {
                                for (int k = 0; k < VisualTreeHelper.GetChildrenCount(current); k++) // in border
                                {
    
                                    current = VisualTreeHelper.GetChild(current, k);
                                    Border b = (Border)current;
                                    b.Background = new System.Windows.Media.SolidColorBrush((Color)ColorConverter.ConvertFromString("#00BAC0")); 
                                    ..........
                                    more code
                                 }
                             }
                          }
                      }
               }
    

    【讨论】:

      【解决方案4】:

      以下示例展示了如何使用可扩展应用程序标记语言 (XAML) 和代码设置 Background 属性的值:

      myBorder1 = new Border();
      myBorder1.BorderBrush = Brushes.SlateBlue;
      myBorder1.BorderThickness = new Thickness(5, 10, 15, 20);
      myBorder1.Background = Brushes.AliceBlue;
      myBorder1.Padding = new Thickness(5);
      myBorder1.CornerRadius = new CornerRadius(15);
      

      【讨论】:

      • 我需要用 x:Name="brdrSNUceniik" 获取现有边界的对象,而不是创建新的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多