C# 如何在codebehind中获得wpf expander togglebutton的宽度

C# 如何在codebehind中获得wpf expander togglebutton的宽度,c#,wpf,C#,Wpf,我想构建一个customcontrol,其中可扩展行被添加到网格中。为了匹配可展开行的列,我添加了另一个网格作为expander标题和内容。然而,这些柱子稍微向右倾斜(见图)。我想这是因为页眉的大小 如何访问togglebutton代码的宽度,以便相应地更改列定义 谢谢 有几种方法可以解决这个问题 有人会试图通过查看和补偿来找到切换按钮的宽度,但这是不可靠的,因为模板可以在.NET版本(以及操作系统,如果我没记错的话)之间更改,而且实现起来很麻烦 第二种方法是尝试通过编程方式找到宽度并进行补偿

我想构建一个customcontrol,其中可扩展行被添加到网格中。为了匹配可展开行的列,我添加了另一个网格作为expander标题和内容。然而,这些柱子稍微向右倾斜(见图)。我想这是因为页眉的大小

如何访问togglebutton代码的宽度,以便相应地更改列定义


谢谢

有几种方法可以解决这个问题

有人会试图通过查看和补偿来找到切换按钮的宽度,但这是不可靠的,因为模板可以在.NET版本(以及操作系统,如果我没记错的话)之间更改,而且实现起来很麻烦

第二种方法是尝试通过编程方式找到宽度并进行补偿,但这仍然需要深入到控件模板中(请参见上面的问题)

第三是让布局引擎为您解决问题。您可以通过在第2-4列上单击并将第1列的宽度设置为“*”来完成此操作。但是,这样做最初会产生不希望的结果,因为Expander标头模板无法设置HorizontalContentAlignment

有了上面提到的一点风险,您可以通过codebehind在模板中挖掘来修复它,但它仍然不是完美的

看起来某处有边界或边界。让我们将扩展器的边界厚度设置为0

啊!更好-(空白消失了),但在.NET4.5中,我们的网格(红色带黑色边框)和绿色之间仍然存在差距。我无法在合理的时间内找到这个间隙的来源,所以我只是将扩展器的裕度设置为0,0,-1,0。这可能需要在扩展器内部根据内容进行补偿,并带来CSS黑客的隐藏记忆(XAML应该更好,不是吗?)

最终结果:

XAML:


可乐
可乐
可乐
可乐
一月
二月
前进
记录1
02.05.2016
05.05.2017
340

代码隐藏:

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Border_Loaded(object sender, RoutedEventArgs e)
    {
        Border root = (Border)sender;
        ContentPresenter presenter = (ContentPresenter)root.TemplatedParent;
        presenter.HorizontalAlignment = HorizontalAlignment.Stretch;
    }
}
//
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
已加载私有无效边框(对象发送方、路由目标)
{
边界根=(边界)发送方;
ContentPresenter=(ContentPresenter)root.TemplatedParent;
presenter.HorizontalAlignment=HorizontalAlignment.Stretch;
}
}

<强>这是可行的,但是如果你发现扩展器中任何一个都太乱,你可能会考虑重写控制模板。< /P>两个问题:1。是在XAML中定义的“Col1”、“Col2”等实列。2.如果我笔直地在“Col1”文本的左边画了一条假想的垂直线,那么在你想要的结果中,你会期望togglebutton位于该线的左侧还是右侧?如果你能发布一些XAML来展示你是如何布局的,它可能也会有所帮助。不幸的是,我不能:)它都是在运行时创建的,在几个堆叠的循环中。所以没有太多的xaml。非常感谢!!!实际上有几个问题:-滚动条弄乱了扩展器的内容。移除后,内容将很好地对齐。(我在发帖后注意到,这是个问题)-我设法拉长了标题,所以效果很好。-然而,我对xaml和wpf非常陌生,所以我对您的解决方案的某些部分有困难。我选择了快捷方式,将expander grid中的第一列设置为34 px以下,目前可以使用。我希望能解决这个问题,一旦我对xaml、aso模板有了更多的了解,我很高兴你已经弄明白了:)

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Border_Loaded(object sender, RoutedEventArgs e)
    {
        Border root = (Border)sender;
        ContentPresenter presenter = (ContentPresenter)root.TemplatedParent;
        presenter.HorizontalAlignment = HorizontalAlignment.Stretch;
    }
}