2016-06-21 3 views
0

나는이 텍스트 상자를 트릭 : 다음 내 스타일을 선택 가지고사용하여 사용자 지정 속성

<Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Style.Resources> 
     <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
      <VisualBrush.Visual> 
       <Label Content="Enter your message here..." Foreground="LightGray" Padding="10 0 0 0" /> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </Style.Resources> 
    <Style.Triggers> 
     <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> 
      <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> 
     </Trigger> 
     <Trigger Property="Text" Value="{x:Null}"> 
      <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocused" Value="True"> 
      <Setter Property="Background" Value="White" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

그러나이 WatermarkText에 대한 XAML 속성 TextBox을 확장하는 방법이있다 그것을 사용하거나 그것을 할 수있는 다른 방법이 있습니까? (C# 등)?

<TextBox WatermarkText="Enter your message here..."/> 
+0

현재 접근법을 사용하고 문자열에 피기 백하는 속성이있는 경우. 여기에 "여기에 메시지를 입력하십시오."를''{TemplateBinding Tag} "'로 바꾸고'Tag' 속성을 이용하여'

+0

@ChrisW. 그것은 정상적으로 작동하지만 일단 내 '태그'를 사용하면 XAML 요소를 더 이상 확장 할 수 없습니다. 더 나은 방법이 있어야합니다 ... – Alexandru

+0

사람들은 빠른 Google 검색으로 찾을 수있는 여러 가지 방법으로 해왔습니다. 개인적으로 필자는 필자가 TextBlock이 포커스가 추가 된 태그에 바인딩 된 추가 된 TextBlock을 사용하여 사용자 지정 템플릿을 만든 것으로 생각하고 텍스트 속성 값 = {x : Null} false (datatrigger를 사용하면 false) 일 때 가시성이 축소되었습니다. 내가 생각했던 것에서 오래 걸리지 않았다. 10mins처럼. –

답변

1

가장 좋은 방법은 스타일로 바인딩 할 수있는 첨부 된 종속성 속성을 사용하는 것입니다. 첨부 된 의존성 속성 바인딩은

Text={Binding (AttachedPropertyName)} 

입니다.() 트릭을 만드십시오.

Mahapps를 살펴보십시오. 멋진 디자인 프레임 워크이며 모든 것을 처리하는 TextBoxHelper 클래스를 제공합니다. 공개 소스이므로 첨부 된 속성을 사용하여 구현 방법을 볼 수 있습니다.

0

난 그냥 .xaml에서 적중 테스트 가시성없이 텍스트 상자와 같은 위치에 라벨을 부착하는 것입니다 무엇을해야하는 가장 쉬운 방법은 다음 .cs에서

<TextBox Name="Username" Grid.Row="2" Height="40" FontFamily="Segoe UI" FontSize="20" VerticalContentAlignment="Center" TextChanged="Username_TextChanged"/> 
<Label Name="UsernameLabel" Content="Username" Grid.Row="2" FontFamily="Segoe UI" FontSize="20" Foreground="LightGray" Padding="5" IsHitTestVisible="False" /> 

:

private void Hostname_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    UpdateLabel(Hostname, HostnameLabel); 
} 

private void UpdateLabel(TextBox textBox, Label label) 
{ 
    label.Visibility = String.IsNullOrWhiteSpace(textBox.Text) ? Visibility.Visible : Visibility.Hidden; 
} 

비밀 번호는 so you cannot inherit them anyways if you tried to extend sealed controls 인 비밀번호 상자에도 적용됩니다.