うコンポーネントのラインナップTabcontrol高さと高さの最大のアイテムです!
-
21-08-2019 - |
質問
必要があります。てtabcontrolのサイズの最大のタブの項目は、実際には、tabitemのコンテンツ)?
以降のtabcontrolは特定のサイズを割り当てでautosize:なが正しくですが、タブを切り替えを自動でサイズの高さや幅)の内容は、現在選択中のタブがあります。
私たいと思っているサイズ変更が起こうのtabcontrolいの高さを誇るアイテムが、まだまだでautosizeそのものです。
他のヒン?またdatabindingの Height
物件の各要素を使用してコンテンツの利用multibinding、バインディングの双方に ActualHeight
の Items
物件のTabcontrol.がその ActualHeight
コンテンツの要素は常に0になります。
<TabItem Header="Core" >
<Grid Margin="5">
<Grid.Height>
<MultiBinding Converter="{Converters1:AllTabContentEqualHeightConverter}">
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
<Binding Path="Items" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TabControl}}"/>
</MultiBinding>
</Grid.Height>
...
で実現できるのだろうか。
解決 3
合わせなければならないという、容易に解消えているのだと思っていた。私たcontroltemplateの TabControl
いずれにせよ、今の高さを設定します ContentPresenter
提ることで、選択されているタブです。これをコンバータと結合するための項目 TabControl
, 対策をしなくてはならない場合があ利用 Measure
渡 DesiredSize
サイズにします。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var items = value as ItemCollection;
if (items == null)
return null;
double max = 0;
foreach (TabItem item in items)
{
var content = item.Content as FrameworkElement;
if (content == null) continue;
if (!content.IsMeasureValid)
content.Measure(new Size(int.MaxValue, int.MaxValue));
var height = content.DesiredSize.Height;
if (max < height)
max = height;
}
return max;
}
この作品は、イブレア城、イブレアは、一部の注意事項:
- 各タブのコンテンツは
FrameworkElement
- の内容などのサイズについては、ロード(コンバータの場合にだけ呼び出され項目の中で特定のプロパティに変更、ieだ).
他のヒント
はい、それを行うことができます:リユース・グリッドrowdefinitions-のfor-each-のTabItemをの
例:
<TabControl Grid.IsSharedSizeScope="True">
<TabItem Header="Tab 1">
<Grid >
<Grid.RowDefinitions>
<RowDefinition SharedSizeGroup="xxx"/>
</Grid.RowDefinitions>
</Grid>
</TabItem>
<TabItem Header="Tab 2">
<Grid >
<Grid.RowDefinitions>
<RowDefinition SharedSizeGroup="xxx"/>
</Grid.RowDefinitions>
</Grid>
</TabItem>
</TabControl>
問題は、 TabControl
unloadsとの固コンテンツとして切り替え機能です。そのためのみぞ知るセカイのサイズコンテンツの活躍中のタブがあります。対応することができるでしょう変化のTabControl、その後の ない 破壊その子が、とても現在のものも隠れた).
このブログ エリック-マーティノー(Ericバークすべきだ。うえしましたが浮遊物のか、変更する必要がありますように:
- すべての子どもを取り込み時に
TabControl
であるとみなされます。 - 子どものたより崩壊した時の不活性
これは、適切なWPFの方法ではおそらくありませんが、あなたはすでに、すべてのコンテンツ要素を持っている場合、あなたは可能性が多分ループそれらを介して負荷にし、プログラム的にTabControl
の高さを設定します。
これは、上に示したGrid.IsSharedSizeScope
のアプローチと一緒に私のために働いています。
そのSetCurrentValue
だけではなく、SelectedIndex
プロパティ設定するのに使用されることに注意してください - 私たちは可能な既存のバインディングを維持し、このように:
private void TabControl_OnLoaded(object sender, RoutedEventArgs e)
{
//NOTE: loop through tab items to force measurement and size the tab control to the largest tab
TabControl tabControl = (TabControl)sender;
// backup selection
int indexItemLast = tabControl.SelectedIndex;
int itemCount = tabControl.Items.Count;
for (
int indexItem = (itemCount - 1);
indexItem >= 0;
indexItem--)
{
tabControl.SetCurrentValue(Selector.SelectedIndexProperty, indexItem);
tabControl.UpdateLayout();
}
// restore selection
tabControl.SetCurrentValue(Selector.SelectedIndexProperty, indexItemLast);
}