伸縮管を埋めItemsControl
-
13-09-2019 - |
質問
る試みを行っています書簡単なコンポーネントのラインナップの学習プロジェクトを作成する設定のボタンの中にresizeableウィンドウに表示します。あります Button
あるコレクションの内容を収集にあたり行します。また、ボタンのウインドウ全体(例えば1ボタン@100%の幅は、2つのボタン@50%の幅、3つのボタン@33%の幅など。すべての100%高さの和)簡易版の立ちたいと思っていまこれまでには:
<ItemsControl x:Name="itemscontrolButtons" ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Tag="{Binding}">
<TextBlock Text="{Binding}" />
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
...
List<string> listButtonTexts = new List<string>() { "Button1", "Button2" };
...
itemscontrolButtons.DataContext = listButtonTexts;
この結果、この
していないのボタンに合わせてストレッチの幅は、私的使用 Grid
の代わりに StackPanel
た虚.
その後、オプションの改善、と思いなどを調整する場合があり多くのボタンできないせラインでは表しきい値までにラップして、新しい線を半減するボタン高さまでは1~2rows).
私がここで強調したいというのはどのようなこの コンポーネントのラインナップ方法.を実現できる消費するウィンドウのリサイズのメッセージおよびリサイズを明示的にすることで、思いのでローコントローラやポートから何を読んでいないにどのようなものを利用するコンポーネントのラインナップ.
解決
すべての子どもUniformGrid、この意志のサイズでアイテムコントロールのパネルを取り付け
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
他のヒント
私の大きな近赤外域の答えに対する監督機能を果たしオプションの基準を可能にするコンポーネントのラインナップ-管理を伸ば複数の並列する。
最初ができることの性質を改変のテンプレート UniformGrid.いるのに必要な店舗への参照です。があり 複数の手法を達成するためのこ.を選んだの ロード イベントの UniformGrid アルコールを参照。
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1" Loaded="UniformGrid_Loaded" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
のコード:
UniformGrid uniformgridButtons;
private void UniformGrid_Loaded(object sender, RoutedEventArgs e)
{
uniformgridButtons = sender as UniformGrid;
}
その後、対応の SizeChanged イベントとの調整を行パラメータに何を基準にします。
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if ((uniformgridButtons != null) && (this.Width > 0))
{
// Set row count according to your requirements
uniformgridButtons.Rows = (int)(1 + ((this.MinWidth * iButtonCount) / this.Width));
}
}
なのでこのコンポーネントのラインナップの管理のレベルでのように近赤外域の答えできるように明示的に調整しに行数を掛けた値です。上記のコードをこの結果:
(アニメーションサンプル こちらの)
更新2009/08/28:
ったので調整は私の知育アプリケーションの ItemsControl
た DataTemplate
別 ResourceDictionary
.しかし、イベントなど Loaded
取り扱うことができません外部 ResourceDictionary
ポファイルでないコードの背後に(あります。そのため、必要キャッシュへの参照 UniformGrid
の異なる。
私は代わりに使用 Alan Haighの FindItemsPanel
方法(第10回答).最初に、私の ItemsControl
:
<ContentPresenter x:Name="contentpresenterButtons" Content="{Binding obscolButtons}" />
そして私 ResourceDictionary
, を入れている ItemsControl
の DataTemplate
:
<DataTemplate DataType="{x:Type local:Buttons}">
<ItemsControl ...
</DataTemplate>
最後に、保存基準の分子を鋳型とし UniformGrid
としてい:
private void Window_Loaded(object sender, RoutedEventArgs e) {
uniformgridButtons = FindItemsPanel<UniformGrid>(contentpresenterButtons);
// Also call the code in Window_SizeChanged which I put in another method
}
この作品と同様に前の解決を必要とせず、イベントハンドラに ResourceDictionary
.
<!-- width must be explicitly set for this example -->
<StackPanel
Name="MyStack"
Orientation="Horizontal"
Width="250"
Load="Window_Loaded">
<Button/>
<Button/>
<Button/>
</StackPanel>
<時間>
public void Window_Loaded(object sender, RoutedEventArgs e)
{
UIElementCollection elements = MyStack.Children;
int count = elements.Count;
foreach (UIElement element in elements)
{
if (element is Button)
((Button)element).Width = MyStack.Width / count;
}
}