私はStackPanel
を持っており、ユーザーが実行時に追加する列をレイアウトするのに最適です。しかし、列のサイズを変更できるようにしたいと思い、GridSplitter
コントロールについて読んでいました。ここに私が疑問に思っているものがあります: GridSplitter
は、WinFormsスプリッタの代わりにwpfですか?言い換えれば、これは、ユーザーがウィンドウの領域のサイズを変更できるようにするための事実上の方法ですか? Grid
の内部でのみ動作しますか?スタックパネルやドックパネルの中にアイテムがある場合でも、私はWinFormsでスプリッタを使用した方法と同じようにグリッドスプリッタを使用できますか? Grid
を使用する必要がある場合、どうすればStackPanel
のように動作させることができますか?wpf:グリッドスプリッタはグリッドの外側で使用できますか?
2
A
答えて
1
以下は、項目を列として追加できるユーザーコントロールです。列の間にグリッドスプリッターがあります。ユーザーは、削除ボタンをクリックして追加した列を削除し、列を後ろのコードを使用して追加することができます。それがあなたが探していたものかどうか私に教えてください。
<UserControl x:Class="SmartGridDemo.SmartGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Name="_grid">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
</Grid>
</UserControl>
の背後にあるユーザーコントロールスマートグリッドコード:
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace SmartGridDemo
{
public partial class SmartGrid : UserControl
{
public SmartGrid()
{
InitializeComponent();
}
public void Add(UIElement child)
{
int columnIndex = _grid.ColumnDefinitions.Count();
_grid.ColumnDefinitions.Add(
new ColumnDefinition()
{
Width = new GridLength(columnIndex == 0 ? 0 :5)
});
GridSplitter gridSplitter =
new GridSplitter()
{
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch,
ResizeDirection = GridResizeDirection.Columns,
Background = Brushes.Black
};
_grid.Children.Add(gridSplitter);
Grid.SetColumn(gridSplitter, columnIndex);
Grid.SetRow(gridSplitter, 0);
Grid.SetRowSpan(gridSplitter, 2);
columnIndex++;
_grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto });
Button button = new Button();
button.Content = "Delete";
button.Tag = new TagTuple() {Child = child, GridSplitter = gridSplitter};
button.Click += new RoutedEventHandler(DeleteButton_Click);
_grid.Children.Add(button);
Grid.SetColumn(button, columnIndex);
Grid.SetRow(button, 0);
_grid.Children.Add(child);
Grid.SetColumn(child, columnIndex);
Grid.SetRow(child, 1);
}
private void DeleteButton_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
int columnIndex = Grid.GetColumn(button);
TagTuple tagTuple = button.Tag as TagTuple;
_grid.Children.Remove(tagTuple.GridSplitter);
_grid.Children.Remove(tagTuple.Child);
_grid.Children.Remove(button as UIElement);
_grid.ColumnDefinitions.RemoveAt(_grid.ColumnDefinitions.Count() - 1);
_grid.ColumnDefinitions.RemoveAt(_grid.ColumnDefinitions.Count() - 1);
foreach (UIElement child in _grid.Children)
{
int columnIndexForChild = Grid.GetColumn(child);
if (columnIndexForChild > columnIndex)
{
Grid.SetColumn(child, columnIndexForChild - 2);
}
}
}
private class TagTuple
{
public GridSplitter GridSplitter { get; set; }
public UIElement Child { get; set; }
}
}
}
デモコード、テキストボックスにテキストを追加して、新しい列を追加するボタンを追加ヒット、XAML:
ユーザーコントロールスマートグリッドXAMLは
<Window x:Class="SmartGridDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SmartGridDemo"
Title="SmartGridDemo" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBox Name="_texBox" Grid.Row="0" Grid.Column="0" />
<Button Content="Add" Click="AddButton_Click" Grid.Row="0" Grid.Column="1" />
<local:SmartGrid x:Name="_smartGrid" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" />
</Grid>
</Window>
デモンストレーションコード:
ここでusing System;
using System.Windows;
using System.Windows.Controls;
namespace SmartGridDemo
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_smartGrid.Add(new TextBlock() { Text = "AAA" });
_smartGrid.Add(new TextBlock() { Text = "BBB" });
_smartGrid.Add(new TextBlock() { Text = "CCC" });
_smartGrid.Add(new TextBlock() { Text = "DDD" });
_smartGrid.Add(new TextBlock() { Text = "EEE" });
_smartGrid.Add(new TextBlock() { Text = "FFF" });
}
private void AddButton_Click(object sender, RoutedEventArgs e)
{
_smartGrid.Add(new TextBlock() { Text = _texBox.Text });
}
}
}
2
GridSplitterはグリッド内でのみ動作し、ユーザーがコントロールのサイズを変更できる最も簡単な方法です。 グリッド(グリッドスプリッター付き)をスタックパネルと同じように動作させることを意味しますか?スタックパネルはそれぞれの子供に正確にフィットし、グリッドスプリッターを備えたグリッドはユーザーに任せます。
0
オープンソースWPF SplitContainerです: [http://wpfsplitcontainer.codeplex.com/]
関連する問題
- 1. WPFグリッド外でのGridSplitterの使用
- 2. 内側のグリッドが外側のグリッドを外にしてクロムを展開しないのはなぜですか
- 3. wpf devexpressグリッドをビジュアルスタジオの内側にドラッグ
- 4. wpf以外のプロジェクトでDLLを使用できません
- 5. 外側グリッドと内側グリッドを等しく整列するには
- 6. グリッドの列と行の長さのWPFコンバータは、グリッドスプリッタが使用されていない場合にのみ動作します
- 7. WPFでは、外側、中央、内側の境界を設定する方法は?
- 8. divはスクロールボックスの外側で伸縮できますか?
- 9. numpy einsum()は外側に追加できますか? numpyので
- 10. カスタムWPFキャンバスコントロール内に点のグリッドを描画できますか?
- 11. UnixではWPFを使用できますか?
- 12. Wpfグリッド内のColumnSpanでSharedSizeGroupを使用する
- 13. 外部で定義されたスコアリング関数を使用してグリッド検索を使用できますか?
- 14. NendetパッケージTelerik.UI.for.AspNet.Coreで剣道UIグリッドを使用できますか?
- 15. どこでもグリッドを使用できますか?
- 16. 外部コントローラクライアント側でsocketIO.emitを使用
- 17. グリッドはこの( 'quirks')モードで使用できませんエラー
- 18. WPFのテキストの外側ベベル効果
- 19. オープンソースプロジェクトでWPFのTelerik radコントロールを使用できますか?
- 20. WPFは:グリッド行
- 21. 高性能グリッドの構築にはどのようなWPFコントロールを使用すべきですか?
- 22. WPFでSQL Server CEでEFコードファーストを使用できますか?
- 23. RadWindowなしでwpfでRadRibbonBarを使用できますか
- 24. WPFインターセプトがモーダルウィンドウの外側をクリック
- 25. クライアント側の剣道UIグリッドでサーバー側のページングを実装しますか?
- 26. クライアント側でoauthトークンを使用できますか?
- 27. WPF Gridを使用する方法はありますか?グリッドと
- 28. ページオブジェクトはキュウリの外で使用できますか?
- 29. wpfスタイル内の内側のグリッドを見つけよう
- 30. slurm計算グリッドでcamel/jbpmを使用することはできますか?
こんにちは、応答に感謝します!私のアプリでは、実行時に親パネルに列を追加することができます。スタックパネルのデフォルトのレイアウト動作のように、列を左に積み重ねてください。しかし、私はまた、列をサイズ変更可能にしたいと思います。私は、OSX FinderのColumnビューに似た何かを目指しています。 –