我正在尝试在表面应用程序中使用 Expander 控件。我已经看到它不是表面控件,因此应用程序编译和控件显示但联系人不起作用。
无论如何我可以修改联系事件并使其在表面应用程序中工作。
我正在尝试在表面应用程序中使用 Expander 控件。我已经看到它不是表面控件,因此应用程序编译和控件显示但联系人不起作用。
无论如何我可以修改联系事件并使其在表面应用程序中工作。
为此,您只需将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"
我讨厌删除这样一个老话题,但这是谷歌搜索结果中的佼佼者,我找到了一个更适合我的解决方案。
在我的 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;
}