有没有办法在 UWP 中进行内联文本编辑(如 Windows Explorer 中的文件重命名)?
Is there a way to get inline text editing in UWP (like file rename in Windows Explorer)?
我们的应用向用户公开对象集合,显示在 ListView 中。每个对象都有一组与之关联的描述性字符串。目前,我们使用的 DataTemplate 具有许多排列在垂直 StackPanel 中的 TextBlock 控件,每个描述性字符串一个 TextBlock。顶部字符串是对象的名称。我们希望为用户提供内联编辑名称的能力。我们的行为模型是 Windows Explorer 或 Visual Studio,您可以在其中重命名文件列表控件中的文件。
是否有使用 UWP/WinUI 完成此操作的推荐方法?
当然可以,您可以将TextBox
与TextBlock
整合在一起,绑定相同的属性,当您双击TextBlock
时,您可以使用xaml behavior来显示 TextBox 并隐藏 TextBlock。文本更新时返回到之前的状态。
<Grid >
<TextBox
x:Name="Editor"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="{x:Bind TextInfo, Mode=TwoWay}"
Visibility="Collapsed">
<Interactivity:Interaction.Behaviors>
<Interactions:EventTriggerBehavior EventName="LostFocus">
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=Editor}"
Value="Collapsed" />
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=DisplayLabel}"
Value="Visible" />
</Interactions:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBox>
<TextBlock
x:Name="DisplayLabel"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="{x:Bind TextInfo, Mode=OneWay}">
<Interactivity:Interaction.Behaviors>
<Interactions:EventTriggerBehavior EventName="DoubleTapped">
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=DisplayLabel}"
Value="Collapsed" />
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=Editor}"
Value="Visible" />
</Interactions:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBlock>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="EditStyleGroup">
<VisualState x:Name="Normal" />
<VisualState x:Name="EditState">
<VisualState.Setters>
<Setter Target="Editor.Visibility" Value="Visible" />
<Setter Target="DisplayLabel.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
我们的应用向用户公开对象集合,显示在 ListView 中。每个对象都有一组与之关联的描述性字符串。目前,我们使用的 DataTemplate 具有许多排列在垂直 StackPanel 中的 TextBlock 控件,每个描述性字符串一个 TextBlock。顶部字符串是对象的名称。我们希望为用户提供内联编辑名称的能力。我们的行为模型是 Windows Explorer 或 Visual Studio,您可以在其中重命名文件列表控件中的文件。
是否有使用 UWP/WinUI 完成此操作的推荐方法?
当然可以,您可以将TextBox
与TextBlock
整合在一起,绑定相同的属性,当您双击TextBlock
时,您可以使用xaml behavior来显示 TextBox 并隐藏 TextBlock。文本更新时返回到之前的状态。
<Grid >
<TextBox
x:Name="Editor"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="{x:Bind TextInfo, Mode=TwoWay}"
Visibility="Collapsed">
<Interactivity:Interaction.Behaviors>
<Interactions:EventTriggerBehavior EventName="LostFocus">
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=Editor}"
Value="Collapsed" />
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=DisplayLabel}"
Value="Visible" />
</Interactions:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBox>
<TextBlock
x:Name="DisplayLabel"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="{x:Bind TextInfo, Mode=OneWay}">
<Interactivity:Interaction.Behaviors>
<Interactions:EventTriggerBehavior EventName="DoubleTapped">
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=DisplayLabel}"
Value="Collapsed" />
<Interactions:ChangePropertyAction
PropertyName="Visibility"
TargetObject="{Binding ElementName=Editor}"
Value="Visible" />
</Interactions:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBlock>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="EditStyleGroup">
<VisualState x:Name="Normal" />
<VisualState x:Name="EditState">
<VisualState.Setters>
<Setter Target="Editor.Visibility" Value="Visible" />
<Setter Target="DisplayLabel.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>