GridコントロールのRow、Column、RowSpan、ColumnSpanに対してバインディングを行いたいと思って色々調べていると下記のサイトを見つけた。
https://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/
GridコントロールのRow、Column、RowSpan、ColumnSpanに対してバインディングを行えるので、Canvasコントロールほど自由度は高くなく、方眼紙を塗りつぶすようなイメージでコントロールの配置を動的に変更できる。
ピクロス的な感じ。
Rowプロパティにバインドすることでバインドされている側のプロパティの値を変えればコントロールの位置を自分で変えることができる。
設定画面を作ればユーザーに自由にコントロールを配置してもらうことができ、単票形式の帳票であれば結構簡単に作れそうな気がする。
<ちょっと手を加えた>
public class GridHelpers
{
#region RowCount Property
/// <summary>
/// Adds the specified number of Rows to RowDefinitions.
/// Default Height is Auto
/// </summary>
public static readonly DependencyProperty RowCountProperty =
DependencyProperty.RegisterAttached(
"RowCount", typeof(int), typeof(GridHelpers),
new PropertyMetadata(-1, RowCountChanged));
// Get
public static int GetRowCount(DependencyObject obj)
{
return (int)obj.GetValue(RowCountProperty);
}
// Set
public static void SetRowCount(DependencyObject obj, int value)
{
obj.SetValue(RowCountProperty, value);
}
// Change Event - Adds the Rows
public static void RowCountChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || (int)e.NewValue < 0)
return;
Grid grid = (Grid)obj;
grid.RowDefinitions.Clear();
for (int i = 0; i < (int)e.NewValue; i++)
grid.RowDefinitions.Add(
new RowDefinition() { Height = GridLength.Auto });
SetStarRows(grid);
// 行幅再設定
SetRowHeight(grid);
}
#endregion
#region ColumnCount Property
/// <summary>
/// Adds the specified number of Columns to ColumnDefinitions.
/// Default Width is Auto
/// </summary>
public static readonly DependencyProperty ColumnCountProperty =
DependencyProperty.RegisterAttached(
"ColumnCount", typeof(int), typeof(GridHelpers),
new PropertyMetadata(-1, ColumnCountChanged));
// Get
public static int GetColumnCount(DependencyObject obj)
{
return (int)obj.GetValue(ColumnCountProperty);
}
// Set
public static void SetColumnCount(DependencyObject obj, int value)
{
obj.SetValue(ColumnCountProperty, value);
}
// Change Event - Add the Columns
public static void ColumnCountChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || (int)e.NewValue < 0)
return;
Grid grid = (Grid)obj;
grid.ColumnDefinitions.Clear();
for (int i = 0; i < (int)e.NewValue; i++)
grid.ColumnDefinitions.Add(
new ColumnDefinition() { Width = GridLength.Auto });
SetStarColumns(grid);
// カラム幅再設定
SetColumnWidth(grid);
}
#endregion
#region StarRows Property
/// <summary>
/// Makes the specified Row's Height equal to Star.
/// Can set on multiple Rows
/// </summary>
public static readonly DependencyProperty StarRowsProperty =
DependencyProperty.RegisterAttached(
"StarRows", typeof(string), typeof(GridHelpers),
new PropertyMetadata(string.Empty, StarRowsChanged));
// Get
public static string GetStarRows(DependencyObject obj)
{
return (string)obj.GetValue(StarRowsProperty);
}
// Set
public static void SetStarRows(DependencyObject obj, string value)
{
obj.SetValue(StarRowsProperty, value);
}
// Change Event - Makes specified Row's Height equal to Star
public static void StarRowsChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
return;
SetStarRows((Grid)obj);
}
#endregion
#region StarColumns Property
/// <summary>
/// Makes the specified Column's Width equal to Star.
/// Can set on multiple Columns
/// </summary>
public static readonly DependencyProperty StarColumnsProperty =
DependencyProperty.RegisterAttached(
"StarColumns", typeof(string), typeof(GridHelpers),
new PropertyMetadata(string.Empty, StarColumnsChanged));
// Get
public static string GetStarColumns(DependencyObject obj)
{
return (string)obj.GetValue(StarColumnsProperty);
}
// Set
public static void SetStarColumns(DependencyObject obj, string value)
{
obj.SetValue(StarColumnsProperty, value);
}
// Change Event - Makes specified Column's Width equal to Star
public static void StarColumnsChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
return;
SetStarColumns((Grid)obj);
}
#endregion
#region ColumnWidth Property
/// <summary>
/// カラム幅設定用独自プロパティ
/// </summary>
public static readonly DependencyProperty ColumnWidthProperty =
DependencyProperty.RegisterAttached(
"ColumnWidth", typeof(int), typeof(GridHelpers),
new PropertyMetadata(0, ColumnWidthChanged));
// 取得処理
public static int GetColumnWidth(DependencyObject obj)
{
return (int)obj.GetValue(ColumnWidthProperty);
}
// 設定処理
public static void SetColumnWidth(DependencyObject obj, string value)
{
obj.SetValue(ColumnWidthProperty, value);
}
// 値変更時処理
public static void ColumnWidthChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
return;
SetColumnWidth((Grid)obj);
}
#endregion
#region RowHeight Property
/// <summary>
/// カラム幅設定用独自プロパティ
/// </summary>
public static readonly DependencyProperty RowHeightProperty =
DependencyProperty.RegisterAttached(
"RowHeight", typeof(int), typeof(GridHelpers),
new PropertyMetadata(0, RowHeightChanged));
// 取得処理
public static int GetRowHeight(DependencyObject obj)
{
return (int)obj.GetValue(RowHeightProperty);
}
// 設定処理
public static void SetRowHeight(DependencyObject obj, string value)
{
obj.SetValue(RowHeightProperty, value);
}
// 値変更時処理
public static void RowHeightChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (!(obj is Grid) || string.IsNullOrEmpty(e.NewValue.ToString()))
return;
SetRowHeight((Grid)obj);
}
#endregion
private static void SetStarColumns(Grid grid)
{
string[] starColumns =
GetStarColumns(grid).Split(',');
for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
{
if (starColumns.Contains(i.ToString()))
grid.ColumnDefinitions[i].Width =
new GridLength(1, GridUnitType.Star);
}
}
private static void SetStarRows(Grid grid)
{
string[] starRows =
GetStarRows(grid).Split(',');
for (int i = 0; i < grid.RowDefinitions.Count; i++)
{
if (starRows.Contains(i.ToString()))
grid.RowDefinitions[i].Height =
new GridLength(1, GridUnitType.Star);
}
}
// カラム幅設定の独自プロパティ設定用
private static void SetColumnWidth(Grid grid)
{
for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
{
grid.ColumnDefinitions[i].Width = new GridLength(GetColumnWidth(grid));
}
}
// 行幅設定の独自プロパティ設定用
private static void SetRowHeight(Grid grid)
{
for (int i = 0; i < grid.RowDefinitions.Count; i++)
{
grid.RowDefinitions[i].Height = new GridLength(GetRowHeight(grid));
}
}
<使い方>
<ScrollViewer Name="scrollDetail" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Grid.Row="1" ScrollViewer.IsDeferredScrollingEnabled="True"
ScrollViewer.PanningMode="VerticalOnly" >
<ItemsControl Name="ic" ItemsSource="{Binding Source={StaticResource GanttGridCellsSource}}" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling" ItemTemplateSelector="{StaticResource ItemViewModelTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid Name="gridCalender" helper:GridHelpers.RowCount="{Binding RowCount}" helper:GridHelpers.ColumnCount="{Binding ColumnCount}"
helper:GridHelpers.ColumnWidth="{Binding ColumnWidth}" helper:GridHelpers.RowHeight="{Binding RowHeight}"
PreviewMouseDown="gridCalender_PreviewMouseDown" Margin="0,0,0,25">
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Column" Value="{Binding Path=ColumnIndex}"/>
<Setter Property="Grid.Row" Value="{Binding Path=RowIndex}"/>
<Setter Property="Grid.ColumnSpan" Value="{Binding Path=ColumnSpan}"/>
<Setter Property="Grid.RowSpan" Value="{Binding Path=RowSpan}"/>
<Setter Property="Grid.ZIndex" Value="{Binding Path=ZIndex}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</ScrollViewer>
登録:
コメントの投稿 (Atom)
PowerShellでDataSetのXMLの内容をシリアライズし、生成された文字列を再度デシリアライズする
修正前のテーブルの内容をXMLデータとして保存し、ログテーブルに格納することで、履歴を退避する Step1 DataSetをシリアライズしXML形式の文字列を作成する Step2 文字列をログテーブルへ保存する(普通にInsert) Step3 ログ...
-
TreeListView上でコンボボックスを利用するときにフォーカスのあるコンボボックスの色をイベントで変えようとしたけど上手くいかなかった。 色々と調べているとXaml側のテンプレートをいじる必要があるみたいだったので、いろいろとやってみた。 とりあえず、コンボボックス...
-
サイトに自動でログインするVBSのソース 事前に対象のWebサイトを開いて、F12キーを押下して、要素の名前を調べておく。 ※Edge、Chromeなどのブラウザ objIE.Visible = Trueの部分を objIE.Visible = Falseにしておけば...
-
開発中のプログラムがあまり進んでないのでSQLの小ネタ。 昔、よくあった遅いSQLの改善方法について、記載。 インデックスを張ったりするのもいいけど、SQLを作るときにデータをたくさん持ってきてまとめて条件分岐をCASE式でするだけで 圧倒的に速度が改善できる。 例えば...
0 件のコメント:
コメントを投稿