2009-07-17 3 views
2

У меня очень простой случай, который, я думаю, выиграет от использования шаблонов (но я не уверен, именно поэтому я и спрашиваю). Все примеры шаблонов, которые я видел, либо предполагают больше знаний, чем я, слишком специфичны для того, чтобы быть полезными для всего новичка, подобного мне, или содержать много вспомогательных материалов, из-за которых трудно определить, что является частью шаблона.wpf control template

Вот установка: У меня есть две метки бок о бок, с первым ярлыком, заполненным именем поля, и вторым ярлыком, заполненным значением поля.

Вот XAML я в настоящее время в моем приложении (много, много раз):

<StackPanel Style="{StaticResource horizontalStackerStyle}"> 
    <Label Style="{StaticResource labelStyle}">Field One:</Label> 
    <Label Style="{StaticResource valueStyle}" Name="field1" 
     Content="{Binding dataObject.field1}" /> 
</StackPanel> 

Я хотел бы создать шаблон таким образом, что я мог бы написать код XAML, как это:

<CustomControlOrWhatever 
    FieldName="Field One:" 
    FieldValue="{Binding dataObject.field1}"/> 

У меня такое чувство, что я могу сделать это с помощью какого-то шаблона. Одно из преимуществ заключается в том, что мне не нужно постоянно указывать стили снова и снова. Я прав? Как мне это сделать?

Заранее благодарен!

UPDATE:

До сих пор не нашли ответа на это. Я выбрал возможное решение с использованием Dependency Properties и попытался задать clarifying question here. Ну, первый ответчик сказал, что мне на самом деле не нужно загромождать мой код с глупостью DP, поэтому я снова его изменил - и он все еще не работает. Может ли кто-нибудь придумать рабочее решение? Кажется, это должно быть так просто.

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

+0

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

+0

Потому что я полный новичок и очень мало опыта с этой системой. Я предполагаю, что вы проверяете ответ, который помог вам больше всего, или лучше всего ответил на вопрос. Проще говоря: я не мог заставить ваше решение работать. Поскольку я не могу понять, является ли проблема с вашим решением или (более вероятно) с моей его реализацией, я решил снять этот флажок. – Klay

ответ

2

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

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    x:Class="SomeNameSpace.SomeControlName"> 
    <Grid x:Name="LayoutRoot"> 
    <StackPanel Style="{StaticResource horizontalStackerStyle}"> 
     <Label Style="{StaticResource labelStyle}" x:Name="FieldNameLbl"></Label> 
     <Label Style="{StaticResource valueStyle}" x:Name="ValueLbl"> 
     </StackPanel> 
    </Grid> 
</UserControl> 

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

public string FieldName 
{ 
    get { return FieldNameLbl.Text; } 
    set { FieldNameLbl.Text = value; } 
} 

public string FieldValue 
{ 
    get { return ValueLbl.Text; } 
    set { ValueLbl.Text = value; } 
} 

А потом звонить, что вы можете поместить это в верхней части окна/страницы с остальной частью ваших заявлений:

xmlns:Controls="clr-namespace:SomeNameSpace" 

, а затем вы можете вставить элемент управления в окно/страницы как это:

+0

Спасибо за тщательный ответ! – Klay

+0

+1, иногда приятно создавать свойства зависимости свойств CLR. – user7116

+0

Очевидно, что необходимо сделать эти свойства зависимостей. Это поле обновляется каждые несколько секунд со значениями из последовательного порта. Поэтому я пытаюсь привязать свойство fieldValue к свойству на моем бизнес-объекте, но я не могу заставить работать свойство зависимостей. Это подходящий способ задать вопрос, или мне нужно задать новый вопрос? – Klay

1

Вы можете создать UserControlFieldControl называется и определить отступающие (автоматические) свойства FieldName и FieldValue. (Нормальные свойства было бы хорошо, так долго, как вам нужно только связать один раз, что, вероятно, так.)

код XAML может выглядеть следующим образом:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      x:Class="foo.bar"> 
    <StackPanel Style="{StaticResource horizontalStackerStyle}"> 
     <Label Style="{StaticResource labelStyle}" Content="{Binding Path=FieldName, Mode=OneTime, StringFormat='{0}: '}"/> 
     <Label Style="{StaticResource valueStyle}" Content="{Binding Path=FieldValue, Mode=OneTime}" /> 
    </StackPanel> 
</UserControl> 

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

+0

Спасибо, он делает! – Klay

+0

Не хватает для голосования? – Noldorin

+0

По-видимому, у меня недостаточно репутации для голосования. Но для более полного ответа на вопрос: Это помогло мне увидеть форму XAML, которая является началом. Но я обнаружил, что для того, чтобы этот UserControl был полезен, мне нужно настроить свойства зависимостей и выяснить, как связать все. Пока не повезло. – Klay

0

То, что вы хотите сделать, аналогично обсуждению вопроса о размещении изображений на кнопке простым способом указания пути, например <Button MyImage="foo.jpg" />.Следуйте за this article для настоящих деталей.

Резюмируя:

  • Очевидным способом было бы создать UserControl, содержащий ваши две метки и разоблачением два свойства. Здесь не так много шаблонов.

  • Большинство решений WPFish, похоже, используют два прикрепленных свойства на одном из меток (скажем, значение) и предоставляют шаблон управления для него, который включает в себя другую метку (описание). В шаблоне вы привязываете каждый текст ярлыка к соответствующему приложенному значению свойства.