C# 如何在接收焦点时使自定义控件的值可编辑
我创建了一个自定义WPF控件,它显示C# 如何在接收焦点时使自定义控件的值可编辑,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我创建了一个自定义WPF控件,它显示Weight属性的值,该属性为int。当用户单击自定义控件或控件获得焦点时,用户应该能够编辑Weight属性的值 为此,我尝试了以下方法: 如果控件处于“非活动”状态,将显示权重属性 在文本块中 如果控件获得焦点,则权重属性 将显示在文本框中 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sche
Weight
属性的值,该属性为int。当用户单击自定义控件或控件获得焦点时,用户应该能够编辑Weight属性的值
为此,我尝试了以下方法:
- 如果控件处于“非活动”状态,将显示权重属性 在文本块中
- 如果控件获得焦点,则权重属性
将显示在文本框中
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfCustomControlLibrary1"> <Style TargetType="{x:Type local:CustomControl1}"> <Style.Resources> <ControlTemplate x:Key="Control_Focused" > <Border Background="Green" BorderBrush="Black" CornerRadius="50" Width="40" Height="40"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBox Width="35" Text="{Binding Mode=TwoWay,Path=Model.Weight,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:CustomControl1}} ,Converter={x:Static local:CustomControl1.IntToStringConverter}}" /> </StackPanel> </Border> </ControlTemplate> <ControlTemplate x:Key="Control"> <Border Background="Green" BorderBrush="Black" CornerRadius="50" Width="40" Height="40"> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock x:Name="PART_TextBlockWeighted" Text="{Binding Mode=TwoWay,Path=Model.Weight,UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type local:CustomControl1}}}" HorizontalAlignment="Center" VerticalAlignment="Center" /> </StackPanel> </Border> </ControlTemplate> </Style.Resources> <Style.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="Template" Value="{StaticResource Control_Focused}" ></Setter> </Trigger> <Trigger Property="IsFocused" Value="False"> <Setter Property="Template" Value="{StaticResource Control}" ></Setter> </Trigger> </Style.Triggers> </Style>
此自定义控件样式的问题在于,当用户单击文本框时,触发器将控件模板更改为TextBlock。如何解决此问题?请尝试改用
IsKeyboardFocusWithin
属性。我相信这会满足你的需要
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Template" Value="{StaticResource Control_Focused}" ></Setter>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="False">
<Setter Property="Template" Value="{StaticResource Control}" ></Setter>
</Trigger>
</Style.Triggers>
为什么不只使用一个文本框,将不可编辑设置为
IsReadOnly=“True”
,如果需要,还可以为其提供不同的样式。