前提・実現したいこと
一度XAMLで配置した複数のTextBlockコントロール全ての中に新たにRunコントロールとInlineUiContainerコントロールを配置したいです。
以下のようにStyleでTagetTypeをTextBlockとすることで、すでに配置したコントロールの中に新たにコントロールを配置することは可能でしょうか。
<Style TargetType="TextBlock"> <Setter Property="" Value="" /> <Setter Property="" Value="" /> </Style>
C#のChildプロパティやChildrenプロパティのようなものを探していたのですが、見当たらなかったのでこちらで質問させていただきました。
試したこと
Styleについては以下のリンクを参考にしました。
https://www.atmarkit.co.jp/ait/articles/1009/07/news096_2.html[連載:WPF入門:
第4回 WPFの「リソース、スタイル、テンプレート」を習得しよう (2/3)]
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
TextBlock
は軽量コンポーネントとしてFrameworkElement
派生なので、Template
等がなくあんまり凝ったことはできないです。
今の解釈でこういうことかな??というサンプルを作りました。
Label
・TextBox
・Button
はいろいろ置いてあるよって程度の意味です。
Canvas
ベースなのも特別意味はありません。
添付ビヘイビアはいろいろとガバガバなので、このままでは使い物にならないだろうと思います。
xml
1<Window 2 x:Class="Questions264652.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:local="clr-namespace:Questions264652" 6 Width="800" 7 Height="450"> 8 <Grid> 9 <Grid.RowDefinitions> 10 <RowDefinition /> 11 <RowDefinition /> 12 </Grid.RowDefinitions> 13 <Grid.ColumnDefinitions> 14 <ColumnDefinition /> 15 <ColumnDefinition /> 16 </Grid.ColumnDefinitions> 17 <GroupBox Header="今の状態"> 18 <Canvas> 19 <TextBlock 20 Canvas.Left="35" 21 Canvas.Top="24" 22 Text="ほげほげ" /> 23 <TextBlock 24 Canvas.Left="177" 25 Canvas.Top="49" 26 Text="ふがふが" /> 27 <Label 28 Canvas.Left="114" 29 Canvas.Top="122" 30 Content="Label" /> 31 <TextBox 32 Canvas.Left="194" 33 Canvas.Top="126" 34 Text="TextBox" /> 35 <Button 36 Canvas.Left="282" 37 Canvas.Top="125" 38 Content="Button" /> 39 </Canvas> 40 </GroupBox> 41 42 <GroupBox Grid.Column="1" Header="こうなるといいなの状態"> 43 <Canvas> 44 <TextBlock Canvas.Left="35" Canvas.Top="24"> 45 <InlineUIContainer BaselineAlignment="Center"> 46 <Image Width="20" Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail_32x32.jpg" /> 47 </InlineUIContainer> 48 <Run>ほげほげ</Run> 49 <Bold>!!</Bold> 50 </TextBlock> 51 <TextBlock Canvas.Left="177" Canvas.Top="49"> 52 <InlineUIContainer BaselineAlignment="Center"> 53 <Image Width="20" Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail_32x32.jpg" /> 54 </InlineUIContainer> 55 <Run>ふがふが</Run> 56 <Bold>!!</Bold> 57 </TextBlock> 58 <Label 59 Canvas.Left="114" 60 Canvas.Top="122" 61 Content="Label" /> 62 <TextBox 63 Canvas.Left="194" 64 Canvas.Top="126" 65 Text="TextBox" /> 66 <Button 67 Canvas.Left="282" 68 Canvas.Top="125" 69 Content="Button" /> 70 </Canvas> 71 </GroupBox> 72 73 <GroupBox Grid.Row="1" Header="テンブレート"> 74 <Canvas> 75 <Canvas.Resources> 76 <Style TargetType="ContentControl"> 77 <Setter Property="Template"> 78 <Setter.Value> 79 <ControlTemplate TargetType="ContentControl"> 80 <TextBlock> 81 <InlineUIContainer BaselineAlignment="Center"> 82 <Image Width="20" Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail_32x32.jpg" /> 83 </InlineUIContainer> 84 <Run Text="{TemplateBinding Content}" /> 85 <Bold>!!</Bold> 86 </TextBlock> 87 </ControlTemplate> 88 </Setter.Value> 89 </Setter> 90 </Style> 91 </Canvas.Resources> 92 <ContentControl 93 Canvas.Left="35" 94 Canvas.Top="24" 95 Content="ほげほげ" /> 96 <ContentControl 97 Canvas.Left="177" 98 Canvas.Top="49" 99 Content="ふがふが" /> 100 <Label 101 Canvas.Left="114" 102 Canvas.Top="122" 103 Content="Label" /> 104 <TextBox 105 Canvas.Left="194" 106 Canvas.Top="126" 107 Text="TextBox" /> 108 <Button 109 Canvas.Left="282" 110 Canvas.Top="125" 111 Content="Button" /> 112 </Canvas> 113 </GroupBox> 114 115 <GroupBox 116 Grid.Row="1" 117 Grid.Column="1" 118 Header="添付ビヘイビア"> 119 <Canvas> 120 <Canvas.Resources> 121 <InlineUIContainer 122 x:Key="image" 123 x:Shared="False" 124 BaselineAlignment="Center"> 125 <Image Width="20" Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail_32x32.jpg" /> 126 </InlineUIContainer> 127 <Bold x:Key="exclamation" x:Shared="False">!!</Bold> 128 129 <Style TargetType="TextBlock"> 130 <Setter Property="local:AddInlineBehavior.Before" Value="{StaticResource image}" /> 131 <Setter Property="local:AddInlineBehavior.After" Value="{StaticResource exclamation}" /> 132 <Setter Property="local:AddInlineBehavior.Use" Value="True" /> 133 </Style> 134 </Canvas.Resources> 135 136 <TextBlock 137 Canvas.Left="35" 138 Canvas.Top="24" 139 Text="ほげほげ" /> 140 <TextBlock 141 Canvas.Left="177" 142 Canvas.Top="49" 143 Text="ふがふが" /> 144 <Label 145 Canvas.Left="114" 146 Canvas.Top="122" 147 Content="Label" /> 148 <TextBox 149 Canvas.Left="194" 150 Canvas.Top="126" 151 Text="TextBox" /> 152 <Button 153 Canvas.Left="282" 154 Canvas.Top="125" 155 Content="Button" /> 156 </Canvas> 157 </GroupBox> 158 </Grid> 159</Window>
cs
1using System.Windows; 2using System.Windows.Controls; 3using System.Windows.Documents; 4 5namespace Questions264652 6{ 7 public class AddInlineBehavior 8 { 9 public static DependencyProperty UseProperty 10 = DependencyProperty.RegisterAttached("Use", typeof(bool), typeof(AddInlineBehavior), 11 new PropertyMetadata(false, OnUseChanged)); 12 public static void SetUse(DependencyObject obj, bool value) => obj.SetValue(UseProperty, value); 13 public static bool GetUse(DependencyObject obj) => (bool)obj.GetValue(UseProperty); 14 private static void OnUseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 15 { 16 if(d is TextBlock textBlock) 17 { 18 if((bool)e.NewValue) 19 { 20 var tmp = textBlock.Text; 21 textBlock.Inlines.Clear(); 22 if(GetBefore(textBlock) is Inline before) 23 { 24 textBlock.Inlines.Add(before); 25 textBlock.Inlines.Add(new Run(" ")); 26 } 27 textBlock.Inlines.Add(new Run(tmp)); 28 if(GetAfter(textBlock) is Inline after) 29 { 30 textBlock.Inlines.Add(new Run(" ")); 31 textBlock.Inlines.Add(after); 32 } 33 } 34 } 35 } 36 37 public static DependencyProperty BeforeProperty 38 = DependencyProperty.RegisterAttached("Before", typeof(Inline), typeof(AddInlineBehavior), 39 new PropertyMetadata(null)); 40 public static void SetBefore(DependencyObject obj, Inline value) => obj.SetValue(BeforeProperty, value); 41 public static Inline GetBefore(DependencyObject obj) => (Inline)obj.GetValue(BeforeProperty); 42 43 public static DependencyProperty AfterProperty 44 = DependencyProperty.RegisterAttached("After", typeof(Inline), typeof(AddInlineBehavior), 45 new PropertyMetadata(null)); 46 public static void SetAfter(DependencyObject obj, Inline value) => obj.SetValue(AfterProperty, value); 47 public static Inline GetAfter(DependencyObject obj) => (Inline)obj.GetValue(AfterProperty); 48 } 49}
投稿2020/05/26 14:15
編集2023/07/22 07:06総合スコア9884
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。