【问题标题】:How to use Gestures to change content of a customcontrol?如何使用手势更改自定义控件的内容?
【发布时间】:2014-12-21 20:06:05
【问题描述】:

我迷路了...回到 SO :)

以下代码通过我的自定义控件 ccGistaFigure 正确显示文本行。我现在在控件上放置一个 InkCanvas。最初,InkCanvas 将设置为仅识别手势。

我想弄清楚的是,在接收到特定手势后,InkCanvas 如何告诉自定义控件进行自我更改,或者,有没有办法让 XAML 将 ccGistaFigure 换成另一个 ccGistaFigure 对象?

具体来说,如果我点击 InkCanvas 上的一个单词,我希望能够确定我点击了哪个单词并强制自定义控件在该单词的字母之间添加空格。因此,如果这个词是“Testing”,那么在这个词上轻按(或手势)应该会将文本更改为“T_e_s_t_i_n_g”。

(ccGistaFigure 派生自 FrameworkElement,直接从 FormattedText 对象显示字符串)。

假设我可以确定被点击的单词,那么更改显示的最佳方法是什么?

我当前的 XAML 是:

<UserControl x:Class="Nova5.UI.Views.Ink.InkEditorView"
       .....

<Grid Background="#FFE24848" >

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
        <Canvas Grid.Row="1" Grid.RowSpan="3">

        <ScrollViewer VerticalScrollBarVisibility="Auto" 
            Width="{Binding Parent.ActualWidth, Mode=OneWay, RelativeSource={RelativeSource Self}}"
            Height="{Binding Parent.ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}" 
              >
           <Grid Background="White" >
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="100"/>
                </Grid.RowDefinitions>
                <wc:ccGistaFigure Grid.Row="0"
                                  Text="{Binding Text, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}" 
                                  LineHeight="{Binding LineHeight, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
                                  AscenderlineOffset="{Binding AscenderlineOffset, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
                                  DescenderlineOffset="{Binding DescenderlineOffset, UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
                                  MidlineOffset="{Binding MidlineOffset,UpdateSourceTrigger=PropertyChanged,Mode=OneWayToSource}"
                                  BaselineOffset="{Binding BaselineOffset, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"
                                  WritingPadSize="{Binding WritingPadSize, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"
                                  />


                <InkCanvas  Grid.Row="0" Grid.RowSpan="2"
                    Background="Transparent" 
                    DefaultDrawingAttributes="{Binding Pen}" 
                    EditingMode="{Binding EditingMode}" 
                    Strokes="{Binding Strokes}" />

            </Grid>
        </ScrollViewer>
    </Canvas>

</Grid>
</UserControl>

任何想法都会受到赞赏。谢谢。

【问题讨论】:

  • 有点不清楚到底在问什么:你有实际“扩展”字母的问题吗?或者你有没有挂接到“嘿,ccGistaFigure 被点击”的事件?或者您还有其他问题吗?
  • @ChrisEelmaa 我实际上遇到了上述所有问题,但我主要希望有一种 XAML 方法以某种方式“切换”出第一个 ccGistaFigure 和第二个 ccGistaFigure ,其中文本已被更改。不过,最大的问题将是准确确定点击了哪个角色。 (注意:我将使用 InkCanvas 提供的“手势”和笔)。谢谢。
  • 您所说的“最大的问题是准确地确定点击了哪个字符”是什么意思? - 为什么你需要知道?我以为我们在谈论文字。

标签: wpf xaml custom-controls inkcanvas


【解决方案1】:

如果你想在ccGistaFigure 上启用触摸事件,你必须这样做:

<wc:ccGistaFigure 
     x:Name="gistaFigure"
     TouchDown="TouchEventHandler"
     IsManipulationEnabled="true" ../>

并在代码隐藏中定义:

private void TouchEventHandler(object sender, TouchEventArgs e)
{
    gistaFigure.InternalText = string.Join("_", gistaFigure.Text.ToCharArray())
}

【讨论】:

  • 谢谢。你回答了这个的第一部分——使用事件。 gistaFigure 是 FrameworkElement 类型,没有“InternalText”,除非您指的是 Text 依赖属性?谢谢。
  • @AlanWayne:很难回答,因为这个问题非常广泛。您不能更改Text,因为这会覆盖实际绑定。您是否需要相同的触摸事件将单词带回“在一起”的功能? M_Y_W_O_R_D => 点击后MYWORD?无论哪种方式,您最终要做的都是:将 ccGistaFigure 包装在自定义控件中,或者编写附加属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多