2

我正在尝试在表面应用程序中使用 Expander 控件。我已经看到它不是表面控件,因此应用程序编译和控件显示但联系人不起作用。

无论如何我可以修改联系事件并使其在表面应用程序中工作。

4

2 回答 2

3

为此,您只需将Expander的模板更改为使用 Surface 控件而不是常规控件。

Expander可以在http://msdn.microsoft.com/en-us/library/ms753296.aspx找到的默认模板。

您只需要更改 ToggleButton:

<ToggleButton OverridesDefaultStyle="True"
              Template="{StaticResource ExpanderToggleButton}"
              IsChecked="{Binding IsExpanded, Mode=TwoWay, 
              RelativeSource={RelativeSource TemplatedParent}}">

更改为

<s:SurfaceToggleButton OverridesDefaultStyle="True"
                       Template="{StaticResource ExpanderToggleButton}"
                       IsChecked="{Binding IsExpanded, Mode=TwoWay, 
                       RelativeSource={RelativeSource TemplatedParent}}">

(省略结束标签)

这假定s绑定到 Surface XML 命名空间:

xmlns:s="http://schemas.microsoft.com/surface/2008"
于 2010-10-31T10:05:41.470 回答
0

我讨厌删除这样一个老话题,但这是谷歌搜索结果中的佼佼者,我找到了一个更适合我的解决方案。

在我的 GUI 加载后,我使用VisualTreeHelper在运行时递归地生成List<DependencyObject>所有 GUI 对象。我的项目出于其他原因需要此 GUI 对象列表,但它也为我提供了一个非常简单的解决方案,可以为非 Surface 控件添加触控支持。

viewObjectList.ForEach(x =>
        {
            var temp = x as System.Windows.Controls.Primitives.ToggleButton;
            if (temp != null)
            {
                temp.IsManipulationEnabled = true;
                temp.TouchUp += TouchUpEvent;
            }
        });

遍历 GUI 对象列表,找到 ToggleButtons(Expander 的实际可点击部分),打开它们的触摸支持,并在触发 TouchUp 时(当用户抬起手指时)将事件绑定到它们。

private void TouchUpEvent(object sender, TouchEventArgs e)
    {
        if (TouchesOver.Count() == 1)
        {
            var temp = sender as System.Windows.Controls.Primitives.ToggleButton;
            temp.IsChecked = !temp.IsChecked;
        }
        e.Handled = false;
    }
于 2015-04-21T04:37:18.787 回答