質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

Q&A

解決済

1回答

5619閲覧

C# XAML triggerの挙動やzindexなどにその他いろいろについて

hartman

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

0グッド

0クリップ

投稿2017/02/09 15:17

編集2017/02/13 14:34
BreadCrumb.xaml.csには public bool trigger; public int zindex; がいるだけです BreadCrumb.xaml <Grid VerticalAlignment="Center" Panel.ZIndex="{Binding zindex}"> <TextBlock x:Name="txt" VerticalAlignment="Center" Height="60" TextWrapping="Wrap" FontSize="20"> <TextBlock.Background> <VisualBrush> <VisualBrush.Visual> <Polygon x:Name="polygon" Fill="AliceBlue" Points="0,60 0,0 65,00 80,30 65,60" Stroke="#000000" /> </VisualBrush.Visual> </VisualBrush> </TextBlock.Background> <TextBlock.Resources> <Style x:Key="style" TargetType="Polygon"> <Style.Triggers> <DataTrigger Binding="{Binding trigger}" Value="true"> <Setter Property="Fill" Value="aqua"/> </DataTrigger> <DataTrigger Binding="{Binding trigger}" Value="false"> <Setter Property="Fill" Value="LightCyan"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Resources> </TextBlock> </Grid>
Control.xaml.cs List<string> str = new List<string> { "あいうえお", "かきくけこ", "あああああ", "あいうえお", "かきくけこ",.............}; double width = this.Width / str.Count; bool firstFlg = false; this.trigger = true; int zindex = str.Count; double mleft = width / 10; int i = str.Count-1; foreach(string msg in str){ if (!firstFlg) { BreadCrumbItems.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); BreadCrumbControl breadControl = new BreadCrumbControl(); breadControl.txb.Width = width; breadControl.txb.Margin = new System.Windows.Thickness(0, 10, 0, 10); breadControl.txb.Text = msg ; breadControl.zindex = zindex; breadControl.trigger = this.trigger; breadControl.DataContext = breadControl; breadControl.SetValue(Grid.RowProperty, 0); breadControl.SetValue(Grid.ColumnProperty, i); BreadCrumbItems.Children.Add(breadControl); firstFlg = true; } else { BreadCrumbItems.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); BreadCrumbControl breadControl = new BreadCrumbControl(); breadControl.txb.Width = width + (mleft * 2.5); breadControl.txb.Margin = new System.Windows.Thickness(0, 10, -(mleft * 2.5), 10); breadControl.txb.Text = msg ; breadControl.zindex = zindex; breadControl.trigger = this.trigger; breadControl.DataContext = breadControl; breadControl.SetValue(Grid.RowProperty, 0); breadControl.SetValue(Grid.ColumnProperty, i); BreadCrumbItems.Children.Add(breadControl); } zindex--; i--; } firstFlg = false; } Control.xaml <Grid Name="BreadCrumbItems" HorizontalAlignment="Stretch" VerticalAlignment="Center" ShowGridLines="True" > <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> </Grid>

やりたいことは画面の横幅いっぱいに図形を均等に並べて
そこにメッセージを載せてパンくずのようにしたいです。

メッセージリストは可変です。

分からないところ・つまっている箇所は

上記で一応横いっぱいに並べることはできているのですが、一番右の図形が少し小さくなってしまいます。
polygonで描写している図形を使い、頭がとんがっている部分だけを右に置かれた図形乗っけたいです。

本当は左から詰めたいのですがBreadCrumb.xamlで指定しているzindexが効かない。本当にここで使えるものかどうかがわからないです。。。
なので右から詰めています。bindingはちゃんと値を見れています。

<TextBlock.Resources>内の<DataTrigger Binding="{Binding trigger}" Value="true">
bindingの値は見れていますが背景の色が変わらないです。
他に背景に図形を指定する方法、またはtriggerを動かすにはどうしたらいいでしょうか?

TextBlock内の文字が縦方向の真ん中に移動してくれません。
VerticalAlignment="Center"はTextBlockだ効かないのでしょうか?

図形をかぶせるために少し伸ばしてその分をmarginに指定して図形をずらしていますが
ouble mleft = width / 10;
breadControl.txb.Width = width + (mleft * 2.5);
breadControl.txb.Margin = new System.Windows.Thickness(0, 10, -(mleft * 2.5), 10);
のmleftですが [10]とか[2.5]適当に数字を指定しています。

この数字を左側の図形のとんがった部分と右の図形が重なった部分の幅にしたいです。

以上です。

特に解決したいのはメッセージの縦方向のセンター寄せとtriggerの部分です。

追記
回答ありがとうございます。

コード見にくくて申し訳ございません。

細かく教えていただきありがとうございます。

コードがスッキリしていて自分の汚いコードが恥ずかしいです。。。

図形を切り分けるという発想はありませんでした。
とういのも実は背景は固定の色で図形の枠の色を変えたかったというのがあり、

/こういうこと? //動的に変えたいならBindingにするか、triggerの値を変えるたびに手動で更新する breadControl.Fill = this.trigger ? Brushes.Aqua : Brushes.LightCyan;

の部分ですが図形の枠の色を変えるために

if (this.trigger) { breadControl.Style = TryFindResource("PolygonAStyle") as Style; } else { breadControl.Style = TryFindResource("PolygonBStyle") as Style; } リソース↓ *Bは枠の色を変えたもの <Style x:Key="PolygonAStyle" TargetType="{x:Type Polygon}"> <Setter Property="Fill" Value=" #FCC404"/> <Setter Property="Stroke" Value="#FF0000"/> </Style>

のようにして枠の色を変えたかったのです。

これを適用してしまうと枠の色が上書きされて三角の左の縦線部分が下図のようにでてきしまうと思うのですが
枠線の色を出しつつ縦線を出さずに”>”の部分だけ線を引くことは可能でしょうか?
イメージ説明

下図のようなイメージです。
![イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご提示のコードはちょっとよくわからない部分が多かったです。
(BreadCrumbControlというのがBreadCrumb.xaml.csとBreadCrumb.xamlのクラス名?
breadControl.txbと書いてあるのは、txtの間違い?
Control.xaml.csの3行目以降の処理はどこに書かれているもの?this.triggerって何?)

とりあえず理解できた(気がする)範囲でお答えします。


  • VerticalAlignment="Center"は、そのコントロール自体(この場合はTextBlock自体)の配置を指定するものです。

コントロール内の文字の配置を中央にしたい場合は、
・Paddingで調整する
・TextBlockをLabelに変えてVerticalContentAlignment="Center"を指定する
・TextBlockの外側にもうひとつLabelかBorderを置いて、Polygonをそっちに描画し、中のTextBlockにVerticalAlignment="Center"を指定する
といった方法が考えられます。


  • 「bindingはちゃんと値を見れています」というのが、どこを見て確認した話なのかわかりませんが、とりあえず、

これだけごりごりコードで書いている感じならば、特にBindingにこだわる必要がないのでは?と思います。
・zindexは breadControl.SetValue(Panel.ZIndexProperty, zindex); のようにして外から指定できます
・背景色についても(ぜひ習得しておきたいということでなければ)StyleのTriggerを使うことにこだわらず、 polygon.Fill = Brushes.Aqua; とやるのが早いかもしれません

  • ちなみに、現状のBindingが動かない理由については、

・zindexがBreadCrumb自体でなく、その中のGridに指定されている
・背景色を定めたStyle( x:Key="style" )がpolygonに適用されていない
・zindexとtriggerがただのフィールドなので、まずプロパティに変更し、さらに必要ならばINotifyPropertyChagnedを実装する
といったあたりに問題がありそうです(説明は省略します)


  • marginの話ですが、そもそもbreadControlの横幅が変更されるときに

とんがり部分の幅も広くなったり狭くなったりするのは意図した仕様なんでしょうか?
とんがり部分の幅は常に固定(15?)で、それ以外の部分だけ幅が変わるようにすれば
marginもめんどくさい計算をせず固定でよいのではないかと思いました。

  • 各ブロックの幅を頑張って計算されていますが、

配置するGridのColumnDefinitionでWidth="*"(GridUnitType.Star)にすると
指定した割合で領域を均等に割ってくれるので、
自分でやるとしたらそうするだろうなあと思いました。


以上をふまえ簡単に書き直してみました。
#最初はできるだけもともとのコードを変えないようにしようかと思いましたが、
#いろいろ気になって、つい書き直しちゃいました…。

BreadCrumb.xaml

XML

1<UserControl x:Class="TeraTail65279.BreadCrumb" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="60"> 4 <Grid> 5 <Grid.ColumnDefinitions> 6 <ColumnDefinition Width="*" /> 7 <!--とんがり部の幅は固定(好きな値に調整してください)--> 8 <ColumnDefinition Width="15" /> 9 </Grid.ColumnDefinitions> 10 11 <!--とんがり部以外の境界線はBorderで--> 12 <Border BorderBrush="#000000" BorderThickness="1,1,0,1" 13 Background="{Binding ElementName=poly, Path=Fill, Mode=OneWay}" /> 14 15 <!--とんがり部の三角形--> 16 <Polygon x:Name="poly" Fill="AliceBlue" Grid.Column="1" Points="0,0 15,30 0,60" /> 17 <!--左の縦線を入れたくないので、境界線だけPolylineで--> 18 <Polyline Stroke="#000000" Grid.Column="1" Points="{Binding ElementName=poly, Path=Points, Mode=OneWay}" /> 19 20 <!--TextBlockがPolygon図形と別コントロールになったのでVerticalAlignmentで中央に配置できる--> 21 <TextBlock x:Name="txt" FontSize="20" VerticalAlignment="Center" /> 22 23 </Grid> 24</UserControl> 25

BreadCrumb.xaml.cs

C#

1public partial class BreadCrumb : UserControl 2{ 3 public BreadCrumb() 4 { 5 InitializeComponent(); 6 } 7 8 //子要素のTextBlockやPolygonを外から直接いじらせたくないので 9 //プロパティをラップして公開する 10 11 public string Text 12 { 13 get 14 { 15 return txt.Text; 16 } 17 set 18 { 19 txt.Text = value; 20 } 21 } 22 23 public Brush Fill 24 { 25 get 26 { 27 return poly.Fill; 28 } 29 set 30 { 31 poly.Fill = value; 32 } 33 } 34 35 public double TextLeftMargin 36 { 37 get 38 { 39 return txt.Margin.Left; 40 } 41 set 42 { 43 txt.Margin = new Thickness(value, txt.Margin.Top, txt.Margin.Right, txt.Margin.Bottom); 44 } 45 } 46}

Control.xaml, Control.xaml.csと書かれてたもの

XML

1<Grid Name="BreadCrumbItems" > 2 <Grid.RowDefinitions> 3 <RowDefinition Height="Auto" /> 4 </Grid.RowDefinitions> 5</Grid>

C#

1bool isFirst = true; 2int zindex = str.Count; 3 4//左から追加していく 5int i = 0; 6foreach (string msg in str) 7{ 8 //Columnの幅をGridUnitType.Starにするのがポイント 9 BreadCrumbItems.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }); 10 11 var breadControl = new BreadCrumb(); 12 breadControl.Text = msg; 13 breadControl.SetValue(Panel.ZIndexProperty, zindex); 14 breadControl.SetValue(Grid.RowProperty, 0); 15 breadControl.SetValue(Grid.ColumnProperty, i); 16 BreadCrumbItems.Children.Add(breadControl); 17 18 //こういうこと? 19 //動的に変えたいならBindingにするか、triggerの値を変えるたびに手動で更新する 20 breadControl.Fill = this.trigger ? Brushes.Aqua : Brushes.LightCyan; 21 22 //最初かどうかで処理を変えるのは↓だけ 23 if (isFirst) 24 { 25 isFirst = false; 26 } 27 else 28 { 29 //↓の処理をまとめてBreadCrumb側にメソッドとして持たせても良い 30 breadControl.Margin = new System.Windows.Thickness(-17, 0, 0, 0); 31 breadControl.TextLeftMargin = 17; 32 } 33 34 zindex--; 35 i++; 36}

1点、ヘボい言い訳ですが、とんがり部の幅が15なのにMargin幅を17にしているのは、
上記のようにBorder部とPolygon部に分けて背景色を塗った場合に、
BorderとPolygonの間(Polygon側)に微妙に隙間ができてしまうらしく
裏にくる右隣のBreadCrumbの線が透けてみえてしまうようだったためです
(Marginを15にしてみていただければわかるかと思います)

投稿2017/02/12 08:31

oika

総合スコア425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oika

2017/02/18 01:07

すみません、追記に気づいてませんでした・・・。 すでに解決されたかもしれませんが、一応お答えしておきます。 >枠線の色を出しつつ縦線を出さずに”>”の部分だけ線を引くことは可能でしょうか? 上記回答に載せた「BreadCrumb.xaml」について、いまいちどれがどの部分にあたるのか まだご理解されてない感じでしょうか? 構造的には以下のようになっています。 ・TextBlock:文字だけ ・Border:右の三角形部以外の背景と枠線 ・Polygon:三角形の背景 ・Polyline:三角形の枠線(左の縦線は無し) なので、枠線の色を変えたいならば、PolygonでなくてBorderとPolylineをいじってやればいいわけです。 BorderとPolylineに名前を付けておいてから、BreadCrumb.xaml.csに以下のようなプロパティを作っておいて --- public Brush Stroke { get { return border.BorderBrush; } set { border.BorderBrush = value; polyline.Stroke = value; } } --- 以下のようにして外から指定してやればよいと思います。 --- if (this.trigger) { breadControl.Stroke = Brushes.Black; } else { breadControl.Stroke = new SolidColorBrush(Color.FromRgb(0xFF, 0x00, 0x00)); } this.trigger = !this.trigger; //交互にする場合 ---
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問