2010-05-23 42 views
2

我想在的Silverlight應用顯示文本,以便用戶可以複製和粘貼它在其他地方(如一個是用來幹什麼的上HTML網站)。什麼是最簡單的方法來刪除Silverlight TextBox鼠標懸停邊框?

如果我使用TextBlock,則用戶無法複製和粘貼。

因此我使用TextBox,但它有一個默認邊框就可以了。我可以刪除邊界與BorderThickness="0"這樣的:

<TextBox 
    Grid.Column="1" 
    BorderThickness="0" 
    Text="{Binding ViewModelBindingStringsBlockHelp}"/> 

偉大的工程:

alt text http://www.deviantsart.com/upload/45p34i.png

然而,當用戶徘徊在文本框中選擇文本,出現另一個邊框

alt text http://www.deviantsart.com/upload/1k7m44p.png

我發現purported solutions用於消除此邊框,但它們令人難以置信地似乎需要XAML的

我正在尋找一個簡單的解決方案這樣的:

HoverBorderThickness="0" 

什麼是簡單的方法來隱藏一個Silverlight文本框的邊框懸停?

回答

1

不幸的是,你需要重新模板。使用Blend將比手動編輯更容易。

0

你所看到的是Focus元素。它是文本框默認模板的一部分。製作自己的模板是控制元素風格的最佳方式。只要刪除主要邊框和焦點元素的邊框,你應該很好走。然後,您不需要再在XAML中內聯設置邊框厚度。

1

只需將此樣式應用於您的文本框即可。這是你做到這一點的唯一方法。

<Style x:Key="TextBoxStyle1" TargetType="TextBox"> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Background" Value="#FFFFFFFF"/> 
    <Setter Property="Foreground" Value="#FF000000"/> 
    <Setter Property="Padding" Value="2"/> 
    <Setter Property="BorderBrush"> 
    <Setter.Value> 
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
     <GradientStop Color="#FFA3AEB9" Offset="0"/> 
     <GradientStop Color="#FF8399A9" Offset="0.375"/> 
     <GradientStop Color="#FF718597" Offset="0.375"/> 
     <GradientStop Color="#FF617584" Offset="1"/> 
    </LinearGradientBrush> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="TextBox"> 
     <Grid x:Name="RootElement"> 
     <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="CommonStates"> 
     <VisualState x:Name="Normal"/> 
     <VisualState x:Name="MouseOver"> 

     </VisualState> 
     <VisualState x:Name="Disabled"> 
      <Storyboard> 
      <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/> 
      </Storyboard> 
     </VisualState> 
     <VisualState x:Name="ReadOnly"> 
      <Storyboard> 
      <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ReadOnlyVisualElement"/> 
      </Storyboard> 
     </VisualState> 
     </VisualStateGroup> 
     <VisualStateGroup x:Name="FocusStates"> 
     <VisualState x:Name="Focused">   
     </VisualState> 
     <VisualState x:Name="Unfocused"> 
     </VisualState> 
     </VisualStateGroup> 
     <VisualStateGroup x:Name="ValidationStates"> 
     <VisualState x:Name="Valid"/> 
     <VisualState x:Name="InvalidUnfocused"> 
      <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <Visibility>Visible</Visibility> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
      </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </VisualState> 
     <VisualState x:Name="InvalidFocused"> 
      <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <Visibility>Visible</Visibility> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
      </ObjectAnimationUsingKeyFrames> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <System:Boolean>True</System:Boolean> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
      </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </VisualState> 
     </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 

     <Grid> 
     <Border x:Name="ReadOnlyVisualElement" Background="#5EC9C9C9" Opacity="0"/> 
     <Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1"> 
      <ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/> 
     </Border> 
     </Grid> 

     <Border x:Name="DisabledVisualElement" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Background="#A5F7F7F7" IsHitTestVisible="False" Opacity="0"/>  
     <Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed"> 
     <ToolTipService.ToolTip> 
     <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" > 
      <ToolTip.Triggers> 
      <EventTrigger RoutedEvent="Canvas.Loaded"> 
      <BeginStoryboard> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
       <DiscreteObjectKeyFrame KeyTime="0"> 
       <DiscreteObjectKeyFrame.Value> 
       <System:Boolean>true</System:Boolean> 
       </DiscreteObjectKeyFrame.Value> 
       </DiscreteObjectKeyFrame> 
       </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
      </BeginStoryboard> 
      </EventTrigger> 
      </ToolTip.Triggers> 
     </ToolTip> 
     </ToolTipService.ToolTip> 
     <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12"> 
     <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/> 
     <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/> 
     </Grid> 
     </Border> 
     </Grid> 
    </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    </Style> 
5

不幸的是,你所遇到想要做的東西,複合地看起來比較簡單,但你必須通過一些跳鐵圈做到這一點。正如在前面的答案中所提到的那樣,需要restyle /重新模板文本框照原樣。

至於懸停狀態 - 這是一個相對較大的Silverlight的點,你應該把握 - 這是每個控件有獨立的狀態的想法。

Expression Blend是處理這些狀態的絕佳方式 - 您可以輕鬆查看內置XAML模板和樣式,並以最少的工作即時編輯它們。可能有時會非常棘手,而且它確實會讓XAML變得有點笨重,但這就是您在控制時所需的成本,完全符合您希望的目標。

利用國家的力量 - 特別是在Blend中 - 我保證你會意識到你的生活可以變得容易多少。

1

設置屬性Readonlytrue

2

這是我沒有背景和邊框創建只讀文本框的解決方案:

public class MyTextBox : TextBox 
{ 
    private String readOnlyText; 
    public String ReadOnlyText 
    { 
     get 
     { 
      return readOnlyText; 
     } 
     set 
     { 
      readOnlyText = value; 
      this.Text = readOnlyText; 
     } 
    } 

    public MyTextBox() 
    { 
     BorderThickness = new Thickness(0); 
     Background = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255)); 
     BorderBrush = new SolidColorBrush(Color.FromArgb(0, 255, 255, 255)); 
     this.TextWrapping = System.Windows.TextWrapping.Wrap; 
     this.GotFocus += new RoutedEventHandler(MyTextBox_GotFocus); 
     this.MouseEnter += new MouseEventHandler(MyTextBox_MouseEnter); 
     this.MouseMove += new MouseEventHandler(MyTextBox_MouseMove); 
     this.TextChanged += new TextChangedEventHandler(MyTextBox_TextChanged); 
    } 

    void MyTextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (!string.IsNullOrEmpty(this.ReadOnlyText)) 
     { 
      var lS = this.SelectionStart; var lL = this.SelectionLength; 
      this.Text = this.ReadOnlyText; 
      this.SelectionStart = lS; this.SelectionLength = lL; 
     } 
    } 

    void MyTextBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     VisualStateManager.GoToState(this, "Normal", false); 
    } 

    void MyTextBox_MouseEnter(object sender, MouseEventArgs e) 
    { 
     VisualStateManager.GoToState(this, "Normal", false); 
    } 

    void MyTextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     VisualStateManager.GoToState(this, "Normal", false); 
    } 
} 
相關問題