2014-11-06 135 views
1

如何使用mouse.simialr將silverlight中的超鏈接內容複製到我們如何在文本框中複製。複製silverlight中的超鏈接內容

我想知道如何選擇silverlight中的超鏈接內容,我目前使用HyperlinkTextStyle,它出現一個矩形,但是當我嘗試用鼠標選擇超鏈接中的內容時,我不能。

我使用以下樣式:

<Setter.Value> 
    <ControlTemplate TargetType="HyperlinkButton"> 
     <Grid 
      Cursor="{TemplateBinding Cursor}" 
      Background="{TemplateBinding Background}"> 
      <vsm:VisualStateManager.VisualStateGroups> 
       <vsm:VisualStateGroup x:Name="CommonStates"> 
       <vsm:VisualState x:Name="Normal"/> 
       <vsm:VisualState x:Name="MouseOver"> 
        <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
         Duration="0" 
         Storyboard.TargetName="UnderlineTextBlock" 
         Storyboard.TargetProperty="Visibility"> 
         <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/> 
        </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </vsm:VisualState> 
       <vsm:VisualState x:Name="Pressed"> 
        <Storyboard> 
        <DoubleAnimation Duration="0" To="0.5" 
         Storyboard.TargetProperty="Opacity" 
         Storyboard.TargetName="TextElement"/> 
        </Storyboard> 
       </vsm:VisualState> 
       <vsm:VisualState x:Name="Disabled"> 
        <Storyboard> 
        <ObjectAnimationUsingKeyFrames Duration="0" 
         Storyboard.TargetName="DisabledOverlay" 
         Storyboard.TargetProperty="Visibility"> 
         <DiscreteObjectKeyFrame 
         KeyTime="0" Value="Visible"/> 
        </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </vsm:VisualState> 
       </vsm:VisualStateGroup> 
       <vsm:VisualStateGroup x:Name="FocusStates"> 
       <vsm:VisualState x:Name="Focused"> 
        <Storyboard> 
        <DoubleAnimationUsingKeyFrames 
         Storyboard.TargetName="FocusVisualElement" 
         Storyboard.TargetProperty="Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
        </Storyboard> 
       </vsm:VisualState> 
       <vsm:VisualState x:Name="Unfocused"/> 
       </vsm:VisualStateGroup> 
      </vsm:VisualStateManager.VisualStateGroups> 
      <Border Background="{TemplateBinding Background}" 
       Margin="{StaticResource PhoneHorizontalMargin}" 
       Padding="{TemplateBinding Padding}"> 
       <TextBlock x:Name="TextElement" 
        HorizontalAlignment="{TemplateBinding 
         HorizontalContentAlignment}" 
        Text="{TemplateBinding Content}" 
        TextDecorations="Underline" 
        VerticalAlignment="{TemplateBinding 
        VerticalContentAlignment}" 
        TextWrapping="Wrap" 
        IsSelectionActive="True"/> 
       <TextBlock 
        HorizontalAlignment="{TemplateBinding 
         HorizontalContentAlignment}" 
        Margin="{TemplateBinding Padding}" 
        x:Name="UnderlineTextBlock" 
        VerticalAlignment="{TemplateBinding 
         VerticalContentAlignment}" 
        Visibility="Collapsed" 
        Text="{TemplateBinding Content}" 
        TextDecorations="Underline" 
        Foreground="{TemplateBinding Foreground}"/> 
       <TextBlock 
        HorizontalAlignment="{TemplateBinding 
         HorizontalContentAlignment}" 
        Margin="{TemplateBinding Padding}" 
        x:Name="DisabledOverlay" 
        VerticalAlignment="{TemplateBinding 
         VerticalContentAlignment}" 
        Visibility="Collapsed" 
        Canvas.ZIndex="1" 
        Foreground="{StaticResource DisabledColor}" 
        Text="{TemplateBinding Content}"/> 
       <ContentPresenter 
        HorizontalAlignment="{TemplateBinding 
         HorizontalContentAlignment}" 
        Margin="{TemplateBinding Padding}" 
        x:Name="contentPresenter" 
        VerticalAlignment="{TemplateBinding 
         VerticalContentAlignment}" 
        Content="{TemplateBinding Content}" 
        ContentTemplate="{TemplateBinding ContentTemplate}"/> 
       <Rectangle 
        x:Name="FocusVisualElement" 
        IsHitTestVisible="false" 
        Opacity="0" 
        Stroke="{StaticResource SecondaryBrush}" 
        StrokeThickness="1"/> 

回答

0

最簡單的方式來獲得與可選擇的文本超鏈接將使用RichTextBox。試試這個,例如:

<RichTextBlock> 
    <Paragraph> 
     <Span></Span> 
     <Hyperlink NavigateUri="http://www.stackoverflow.com">Selectable</Hyperlink> 
     <Span></Span> 
    </Paragraph> 
</RichTextBlock> 

上述可能不正是你想要的(你必須先點擊到左邊或文本選擇權 - 不能在中間點擊)。


另一種方法是使用一個TextBox,風格它看起來像一個超鏈接,並添加一個鼠標點擊事件進行導航。大致爲:

<TextBox x:Name="textBox" 
     Tag="http://www.stackoverflow.com" 
     Cursor="Hand" BorderThickness="0" Foreground="Blue" 
     Text="Selectable"/> 

但是,這是一個有點棘手,因爲你需要弄清楚用戶是否點擊選擇,或點擊瀏覽。也許最好的辦法是同時處理「鼠標向下」和「鼠標向上」事件,如果它們之間的時間間隔爲< x毫秒,則執行導航。

此外,要使鼠標單擊事件正常工作,您必須使用AddHandler來添加偵聽器,因爲TextBox本身在控件內部處理鼠標點擊。所以,這樣的事情:

private DateTime? _downClickTime; 

public MyPage() 
{ 
    InitializeComponent(); 

    txt.AddHandler(MouseLeftButtonUpEvent, new MouseButtonEventHandler(TextBox_MouseLeftButtonUp), true); 
    txt.AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(TextBox_MouseLeftButtonDown), true); 
} 

private void TextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    _downClickTime = DateTime.Now; 
} 

private void TextBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (_downClickTime.HasValue && DateTime.Now.Subtract(_downClickTime.Value).TotalMilliseconds < 200) 
    { 
     var textBox = (TextBox)sender; 
     string url = textBox.Tag as string; 
     HtmlPage.Window.Navigate(new Uri(url)); 
    } 
    _downClickTime = null; 
} 
0

我找到了這種要求的解決方案。希望它可以幫助ohers

      <DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </vsm:VisualState> 
          <vsm:VisualState x:Name="Pressed"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="UnderlineTextBlock" Storyboard.TargetProperty="Visibility"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </vsm:VisualState> 
          <vsm:VisualState x:Name="Disabled"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="DisabledOverlay" Storyboard.TargetProperty="Visibility"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="Visible" /> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </vsm:VisualState> 
         </vsm:VisualStateGroup> 
         <vsm:VisualStateGroup x:Name="FocusStates"> 
          <vsm:VisualState x:Name="Focused"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SelectingText" Storyboard.TargetProperty="Opacity"> 
             <SplineDoubleKeyFrame KeyTime="0" Value="0.25" /> 
            </DoubleAnimationUsingKeyFrames> 

           </Storyboard> 
          </vsm:VisualState> 
          <vsm:VisualState x:Name="Unfocused" > 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="SelectingText" Storyboard.TargetProperty="Opacity"> 
             <SplineDoubleKeyFrame KeyTime="0" Value="0" /> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </vsm:VisualState> 
         </vsm:VisualStateGroup> 
        </vsm:VisualStateManager.VisualStateGroups> 

        <!--<TextBox Margin="{TemplateBinding Padding}" Foreground="{TemplateBinding Foreground}" 
           IsReadOnly="True" 
           x:Name="SelectingText" 
           Text="{TemplateBinding Content}" Opacity="0" />--> 

        <TextBox x:Name="SelectingText" Background="Transparent" Foreground="Transparent" FontWeight="{TemplateBinding FontWeight}" 
          FontStyle="{TemplateBinding FontStyle}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" IsReadOnly="True" 
          Margin="{TemplateBinding Padding}" 
           Text="{TemplateBinding Content}" Opacity="0" 
          /> 

        <TextBlock HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" x:Name="UnderlineTextBlock" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Visibility="Collapsed" Text="{TemplateBinding Content}" TextDecorations="Underline" Foreground="{TemplateBinding Foreground}" /> 
        <TextBlock HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" x:Name="DisabledOverlay" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Visibility="Collapsed" Canvas.ZIndex="1" Foreground="{StaticResource DisabledColor}" Text="{TemplateBinding Content}" /> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" /> 
        <Rectangle x:Name="FocusVisualElement" IsHitTestVisible="false" Opacity="0" Stroke="{StaticResource SecondaryBrush}" StrokeThickness="1" /> 

       </Grid> 

在下劃線替換文字塊的文本框,並在鼠標移動

使用