2010-03-12 3 views
0

Мне интересно, если кто-нибудь знает способ легко получить двойной эффект границы в WPF подобно тому, что вы видите в выбранных элементах в проводнике Windows в Windows 7.Double Border с визуалой в WPF

Example of what I'm looking for

Если вы посмотрите внимательно, вы заметите, что выбранный элемент имеет темную границу, более светлую, внутреннюю границу, а затем фон градиента.

В настоящее время я использую две границы вокруг объекта в любое время, когда хочу достичь этого эффекта. Выполнение этого способа уродливо синтаксически и действительно мешает моему представлению xaml. Будучи веб-разработчиком в глубине души, я хотел бы как можно больше отделить структуру xaml от стиля. Итак, я начал размещать это в шаблонах Styles и Content Templates, чтобы вытащить его из моего представления xaml.

Тем не менее, мне любопытно, может ли быть лучший способ сделать это.

Я некоторое время играл с VisualBrush в качестве фона, чтобы попытаться получить эффект. Тем не менее, я хочу, чтобы иметь возможность применять фон к элементам, которые могут быть любого размера, и способ, которым VisualBrush растягивал визуальную форму, чтобы соответствовать фон элемента, не работал так, как я этого хотел. По сути, я бы просто хотел, чтобы он растягивал визуальный образ, как это делает система макета WPF.

Любые идеи были бы весьма признательны.

- Dusty

+0

Если область рисуется с двумя вложенными границами, что некрасиво о синтаксисе, говоря так? И если вы используете шаблон для его создания, что замаскивается? Я не понимаю. –

+0

Причина, по которой это уродливо, состоит в том, что семантически, границы и фон ничего не означают. Если я хочу изменить «скин» своего приложения через 6 месяцев, я не хочу искать все места, в которые я помещал эти границы, чтобы посмотреть, чтобы я мог их изменить. Я согласен с тем, что использование шаблона для его создания лучше, мне было просто любопытно, можно ли использовать VisualBrush таким образом. – dustyburwell

ответ

1

визуал, вероятно, не то, что вы хотите сделать в этом случае, так как это довольно тяжелые.

Вы можете решить эту проблему с помощью Xaml без границ вложенности.

Например,

<Border BorderBrush="#FF00B5C5" BorderThickness="1" CornerRadius="2" Background="White"> 
    <Grid Background="#FF00B5C5" Margin="1"> 
    <Rectangle Fill="#FFA2F2FE" /> 
    <TextBlock Text="This is some text" VerticalAlignment="Center"/> 
    </Grid> 
</Border> 

Вы можете, конечно, настроить свойства, чтобы получить вид вам нужно.

EDIT: Если вы хотите создать стиль, так что вы можете Рескин внешний вид и на ощупь, вы можете сделать что-то вроде этого:

<Window.Resources> 
    <Style x:Key="BorderedTextBlock" TargetType="ContentControl"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Border BorderBrush="#FF00B5C5" BorderThickness="1" CornerRadius="2" Background="White"> 
         <Grid Background="#FF00B5C5" Margin="1"> 
         <Rectangle Fill="#FFA2F2FE" /> 
         <TextBlock Text="{Binding}" VerticalAlignment="Center"/> 
         </Grid> 
        </Border> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <ContentControl Style="{StaticResource BorderedTextBlock}" Content="This is some text" Width="200" Height="24"/> 
</Grid> 

Кроме того, превратить это в пользовательский элемент управления со всеми параметры стиля и тематики, которые вам нужны.

Надежда, что помогает,

Sergio

+0

Хотя я не совсем то, что искал, ваши советы звучат. Я полагаю, что использование VisualBrush, вероятно, не так уж и сильное. – dustyburwell

+0

Я не думаю, что вы когда-нибудь получите VisualBrush, чтобы выглядеть именно так, как вы хотите из-за фактора растяжения.По мере того, как масштабируется до заполнения элемента, «фальшивая» рамка также будет увеличиваться, поэтому вы не получите эту красивую 1 пиксельную белую рамку внутри. Стили и темы (и, возможно, пользовательский контроль) - это путь, чтобы устранить избыточность и беспорядок. – SergioL

+0

Я ценю этот совет, SergioL. Я не очень много думал об этом, но это именно то, что делают стандартные стандартные элементы ControlTemplates. Например, Button использует ButtonChrome в Luna и Aero для своей границы. Спасибо, что пробежал мой мозг. – dustyburwell

 Смежные вопросы

  • Нет связанных вопросов^_^