わかりました、これは一見奇妙に思えるかもしれませんが、それが正しい方法だと信じています。から派生し、コンテンツをホストするためにそこにTextBox
追加し、そのコンテンツを設定するプロパティを追加しました。ContentPresenter
Content
そこで、TextBoxContainer という名前の WPF カスタム コントロール (Visual Studio テンプレート) を作成します。次のプロパティを追加します。
#region Content (DependencyProperty)
/// <summary>
/// Gets or sets Content property
/// </summary>
public object Content
{
get { return (object)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public static readonly DependencyProperty ContentProperty =
DependencyProperty.Register("Content", typeof(object), typeof(TextBoxContainer),
new PropertyMetadata(null));
#endregion
Assets/generic.xaml ファイルのスタイルを次のように置き換えます。
<LinearGradientBrush x:Key="TextBoxBorder" EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0">
<GradientStop Color="#ABADB3" Offset="0.05"/>
<GradientStop Color="#E2E3EA" Offset="0.07"/>
<GradientStop Color="#E3E9EF" Offset="1"/>
</LinearGradientBrush>
<Style TargetType="{x:Type local:TextBoxContainer}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="AllowDrop" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TextBoxContainer}">
<Grid>
<Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
<ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Microsoft_Windows_Themes:ListBoxChrome>
<ContentPresenter Content="{TemplateBinding Content}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
そして、次のように使用します。
<local:TextBoxContainer TextChanged="TextBoxGrid_TextChanged" >
<local:TextBoxContainer.Content>
<Grid>
<!-- Any markup here -->
</Grid>
</local:TextBoxContainer.Content>
</local:TextBoxContainer>
いつでも、入力されたすべてのテキストを含むテキストがあることに注意してください。注意すべき唯一のことは、一部の要素が一部のイベントの発生を妨げているということです。たとえば、イベントのバブリングをTextBox
停止します。KeyDown
したがって、TextBox
内部TextBoxContainer
に配置し、ユーザーがそれをクリックしてそこにテキストを入力し始めると、イベントは発生しますが、TextBoxContainer はそのテキストを受け取りませんTextChanged
。