从XAML inC#访问边框

问题描述 投票:0回答:4

如何在C#代码中访问XAML文件的边框?我搜索但没有发现任何东西,对WPF来说有点新,所以不知道如何实现概念。

My current border in XAML

我想在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>
c# .net wpf visual-studio
4个回答
1
投票

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

您必须执行几乎相同的过程,但您将引用自己的模板,而不是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
投票

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


0
投票

正如@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
                             }
                         }
                      }
                  }
           }

-2
投票

以下示例说明如何使用可扩展应用程序标记语言(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);
© www.soinside.com 2019 - 2024. All rights reserved.