我正在尝试在表面应用程序中使用Expander控件。我已经看到它不是表面控件,所以应用程序编译和控制显示但联系人不起作用。
无论如何,我可以修改联系事件并使其在表面应用程序中起作用。
答案 0 :(得分:3)
要做到这一点,您所要做的就是更改Expander
的模板以使用Surface控件而不是常规控件。
可以在http://msdn.microsoft.com/en-us/library/ms753296.aspx找到Expander
的默认模板。
您需要更改的是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"
答案 1 :(得分:0)
我讨厌这个老话题,但这是谷歌的最高结果,我找到了一个对我有用的解决方案。
我的GUI加载后,我递归使用VisualTreeHelper在运行时生成List<DependencyObject>
所有GUI对象。由于其他原因,我的项目需要这个GUI对象列表,但它也为我提供了一个非常简单的解决方案,可以为非Surface控件添加Touch支持。
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;
}