2011-03-30 59 views
1

我有一個簡單的TextBlock這樣的(它必須是一個TextBlock):TextBlock HyperLink和Anchor?

<ScrollViewer Height="50" VerticalAlignment="Top"> 
<TextBlock> 
    <Hyperlink TargetName="TestAnchor">Test</Hyperlink><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <TextBlock Text="Line" /><LineBreak /> 
    <Hyperlink Name="TestAnchor" /> 
</TextBlock> 
</ScrollViewer> 

我想怎麼辦時,用戶點擊超鏈接的頂部,它會向下滾動錨上底部。這在WPF中甚至可能嗎?

謝謝!

+0

錨所擁有的一切(除了新ICommand類) ,就像在HTML中(而不是Windows窗體)?我不這麼認爲。 – Marcote 2011-03-30 13:10:46

+0

是的,HTML錨點。 – SaphuA 2011-03-30 13:15:51

回答

2

您可以使用BringIntoView方法,該方法應該將您的scrollViewer滾動到您調用BringIntoViewFrameworkElement。下一步是將點擊的超鏈接與目標超鏈接進行匹配。最直接的方法是使用Dictionary。最後一步是處理Hyperlink.Click事件。

後面的代碼:

private readonly Dictionary<Hyperlink,FrameworkElement> HyperlinkTargets = 
        new Dictionary<Hyperlink,FrameworkElement>(); 

public Constructor() 
{ 
    InitializeComponent(); 
    HyperlinkTargets.Add(TestHyperlink, TestAnchor); 
} 

// this event handler should be attached to hyperlinks which will be used for navigation 
private void Hyperlink_Click(object sender, RoutedEventArgs e) 
{ 
    var clickedHyperlink = (Hyperlink)sender; 
    var targetHyperlink = HyperlinkTargets[clickedHyperlink]; 
    targetHyperlink.BringIntoView(); 
} 

這是基本的H.B.的從他的評論想法的實現。


另一個解決方案剛剛出現在我的腦海。如果您想將更多代碼移動到XAML中,您可以創建一個命令,該命令將導航到作爲參數傳遞的元素。下面是一個命令類:

class NavigateToCommand : ICommand 
{ 
    public void Execute(object parameter) 
    { 
     ((FrameworkElement)parameter).BringIntoView(); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return parameter is FrameworkElement; 
    } 

    public event EventHandler CanExecuteChanged; 
} 

而且你可以使用它你的樣品是這樣的:

<ScrollViewer Height="50" VerticalAlignment="Top"> 
<ScrollViewer.Resources> 
    <local:NavigateToCommand x:Key="navigateToCommand" /> 
</ScrollViewer.Resources> 
<TextBlock> 
    <Hyperlink Command="{StaticResource navigateToCommand}" 
       CommandParameter="{Binding ElementName=TestAnchor}">Test</Hyperlink><LineBreak /> 
    /* TextBlocks */ 
    <Hyperlink Name="TestAnchor" /> 
</TextBlock> 
</ScrollViewer> 

這將允許你在XAML

+0

除非有人使用僅限XAML的解決方案,否則這將是我將前往的方向。謝謝! – SaphuA 2011-03-31 07:16:31

+0

@SaphuA,增加了另一種解決方案,它有更多的XAML和更少的代碼隱藏 – Snowbear 2011-03-31 08:10:09

+0

這更加棒! – SaphuA 2011-04-06 11:38:40

0

TargetName根據MSDN只適用於窗口和框架,所以這是不可能的。

+0

TargetName的任何替代品都可以;)我只從我的測試代碼複製了TargetName,這是我感興趣的方法。 – SaphuA 2011-03-30 13:16:20

+1

我不知道任何替代品,如果全部失敗,您可以處理單擊事件,按名稱查找目標元素,並在滾動查看器中調用一些滾動查看方法。 – 2011-03-30 13:20:07