WPFのExpander
コントロールは、利用可能なすべてのスペースを埋めるために拡大されません。これに対する XAML の解決策はありますか?
36917 次
8 に答える
49
あなたがする必要があるのはこれだけです:
<Expander>
<Expander.Header>
<TextBlock
Text="I am header text..."
Background="Blue"
Width="{Binding
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType={x:Type Expander}},
Path=ActualWidth}"
/>
</Expander.Header>
<TextBlock Background="Red">
I am some content...
</TextBlock>
</Expander>
http://joshsmithonwpf.wordpress.com/2007/02/24/stretching-content-in-an-expander-header/
于 2009-03-25T07:10:37.937 に答える
7
このソリューションは非常に単純で、アプリケーションで使用する可能性のある他のエキスパンダー コントロールには影響しません。
<Expander ExpandDirection="Right" Grid.Column="0" Name="topOfB">
<Expander.Header>
<Grid HorizontalAlignment="Stretch" Width="{Binding Path=ActualWidth, ElementName=topOfB}">
<!-- control content goes here -->
于 2010-12-15T18:55:56.463 に答える
4
ヘッダー コンテンツが 1 つの列にあり、エキスパンダー ボタンが最初の列にあるため、受け入れられた回答はコントロールの外に描画されます。場合によっては十分かもしれません。
クリーンなソリューションが必要な場合は、エキスパンダーのテンプレートを変更する必要があります。
もう 1 つの方法は、添付プロパティです。
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
public static class ParentContentPresenter
{
public static readonly System.Windows.DependencyProperty HorizontalAlignmentProperty = System.Windows.DependencyProperty.RegisterAttached(
"HorizontalAlignment",
typeof(HorizontalAlignment),
typeof(ParentContentPresenter),
new PropertyMetadata(default(HorizontalAlignment), OnHorizontalAlignmentChanged));
public static void SetHorizontalAlignment(this UIElement element, HorizontalAlignment value)
{
element.SetValue(HorizontalAlignmentProperty, value);
}
[AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
[AttachedPropertyBrowsableForType(typeof(UIElement))]
public static HorizontalAlignment GetHorizontalAlignment(this UIElement element)
{
return (HorizontalAlignment)element.GetValue(HorizontalAlignmentProperty);
}
private static void OnHorizontalAlignmentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var presenter = d.Parents().OfType<ContentPresenter>().FirstOrDefault();
if (presenter != null)
{
presenter.HorizontalAlignment = (HorizontalAlignment) e.NewValue;
}
}
private static IEnumerable<DependencyObject> Parents(this DependencyObject child)
{
var parent = VisualTreeHelper.GetParent(child);
while (parent != null)
{
yield return parent;
child = parent;
parent = VisualTreeHelper.GetParent(child);
}
}
}
次のことができます。
<Expander Header="{Binding ...}">
<Expander.HeaderTemplate>
<DataTemplate>
<!--Using a border here to show how width changes-->
<Border BorderBrush="Red" BorderThickness="1"
local:ParentContentPresenter.HorizontalAlignment="Stretch">
...
</Border>
</DataTemplate>
</Expander.HeaderTemplate>
</Expander>
添付プロパティの使用は、テンプレートに があることを前提としているため、やや脆弱であることに注意してContentPresenter
ください。
于 2015-10-28T20:55:42.053 に答える
2
<Expander Name="EXPANDER_NAME">
<Expander IsExpanded="True" Margin="0">
<Expander.Header>
<Grid Background="Red" Width="{Binding ElementName=EXPANDER_NAME, Path=ActualWidth}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<TextBlock> HEADER TEXT <TextBlock>
</Grid>
</Expander.Header>
</Expander>
于 2012-11-05T04:53:37.717 に答える
0
Silverlight Toolkit には、使用可能なスペースに常に拡張するエキスパンダーのように機能するアコーディオンコントロールが含まれています。まだテストしていませんが、Silverlight Chart コントロールのように、WPF でも機能する可能性があります。
于 2009-03-25T12:38:05.357 に答える