HierarchicalDataTemplate 扩展器中的超链接未触发 HandleOnRequestNavigate 事件
Hyperlink in Expander of HierarchicalDataTemplate not firing HandleOnRequestNavigate event
我想我添加了所有必要的部分以将自定义 link 处理添加到我的树视图中,但是当我在调试器中单步执行代码时,我发现我后面的代码从未被调用。
我试图像这样向我的树视图添加一个 hyperlink:
<HierarchicalDataTemplate DataType="{x:Type this:StructuredViewNode}" ItemsSource="{Binding Children}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Margin="3" TextWrapping="WrapWithOverflow">
<Hyperlink NavigateUri="{Binding Reference}" RequestNavigate="HandleOnRequestNavigate" >
<TextBlock Text="{Binding ObjectName}"/>
</Hyperlink>
</TextBlock>
</Grid>
</HierarchicalDataTemplate>
我有所需的代码:
private void HandleOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
// Do custom link handling
e.Handled = true;
}
也许有趣的是,树有一个自定义样式,hyperlink 所在的部分是一个扩展器,定义如下:
<Expander Name="Exp" IsExpanded="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" >
<Expander.Header>
<!-- Displays the item's header in the Expander. -->
<ContentPresenter ContentSource="Header" />
</Expander.Header>
<StackPanel>
<Separator Margin="5" Width="Auto" Background="{StaticResource ItemBorderBrush}" Height="6" ></Separator>
<!-- Displays the item's children. -->
<ItemsPresenter />
</StackPanel>
</Expander>
有人知道为什么我的 hyperlink 处理代码没有被调用吗?
提前致谢!
原来问题是您只能将 strings
作为 URI。所以最简单的解决方案似乎是编写一个转换器并像这样添加对象:
<Hyperlink NavigateUri="{Binding ObjectReference,
Converter={StaticResource ObjectToStringConverter}}"
RequestNavigate=""HandleOnRequestNavigate">
<TextBlock Text="{Binding ObjectReference}"/>
</Hyperlink>
谢谢;
为了总结我们的交换,超链接只接受有效的 url 作为 Uri 对象或字符串,并且只会在这种情况下触发导航事件。如果是 businnes 对象,请将其更改为蓝色前景 Label 控件,更改 Cursor =Cursors.Hand,在您的视图模型中处理单击事件或自定义 MVVM 命令。这样做的伎俩。 :-)
我想我添加了所有必要的部分以将自定义 link 处理添加到我的树视图中,但是当我在调试器中单步执行代码时,我发现我后面的代码从未被调用。
我试图像这样向我的树视图添加一个 hyperlink:
<HierarchicalDataTemplate DataType="{x:Type this:StructuredViewNode}" ItemsSource="{Binding Children}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Margin="3" TextWrapping="WrapWithOverflow">
<Hyperlink NavigateUri="{Binding Reference}" RequestNavigate="HandleOnRequestNavigate" >
<TextBlock Text="{Binding ObjectName}"/>
</Hyperlink>
</TextBlock>
</Grid>
</HierarchicalDataTemplate>
我有所需的代码:
private void HandleOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
// Do custom link handling
e.Handled = true;
}
也许有趣的是,树有一个自定义样式,hyperlink 所在的部分是一个扩展器,定义如下:
<Expander Name="Exp" IsExpanded="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" >
<Expander.Header>
<!-- Displays the item's header in the Expander. -->
<ContentPresenter ContentSource="Header" />
</Expander.Header>
<StackPanel>
<Separator Margin="5" Width="Auto" Background="{StaticResource ItemBorderBrush}" Height="6" ></Separator>
<!-- Displays the item's children. -->
<ItemsPresenter />
</StackPanel>
</Expander>
有人知道为什么我的 hyperlink 处理代码没有被调用吗?
提前致谢!
原来问题是您只能将 strings
作为 URI。所以最简单的解决方案似乎是编写一个转换器并像这样添加对象:
<Hyperlink NavigateUri="{Binding ObjectReference,
Converter={StaticResource ObjectToStringConverter}}"
RequestNavigate=""HandleOnRequestNavigate">
<TextBlock Text="{Binding ObjectReference}"/>
</Hyperlink>
谢谢; 为了总结我们的交换,超链接只接受有效的 url 作为 Uri 对象或字符串,并且只会在这种情况下触发导航事件。如果是 businnes 对象,请将其更改为蓝色前景 Label 控件,更改 Cursor =Cursors.Hand,在您的视图模型中处理单击事件或自定义 MVVM 命令。这样做的伎俩。 :-)