2009-10-15 4 views
2

Хорошо, у меня есть ResourceDictionary определение, которое я использовал для приложения WPF ниже:МОФ по SilverLight вопросу XAML

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<Style x:Key="fieldsPanel" TargetType="{x:Type StackPanel}"> 
    <Style.Resources> 
     <Style TargetType="{x:Type CheckBox}"> 
      <Setter Property="Margin" Value="8 2" /> 
     </Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Margin" Value="0 2" /> 
      <Setter Property="Width" Value="100" /> 
     </Style> 
    </Style.Resources> 
</Style> 

Это точный блок XAML, когда принес в мой Silverlight приложение, показывает 4 ошибки в панели ошибок (первая ошибка появляется в 3 раза, второй раз)

  1. тег «Type» не существует в пространстве имен XML «http://schemas.microsoft.com/winfx/2006/xaml»

  2. Свойство «Resources» не существует на «Style» типа в пространстве имен XML «http://schemas.microsoft.com/winfx/2006/xaml/presentation»

Я могу сделать все экземпляры первой ошибки уходят, заменив «{х: Type TypeName} "text with" TypeName ". Но это правильный способ исправить это? Это просто еще одна случайная и произвольная разница между WPF и Silverlight?

Но я не могу понять, что я делаю неправильно во второй ошибке. Может ли кто-нибудь мне помочь (и место, где вы нашли ответ)?

EDIT:

Если бы я знал, как Google «Style.Resources» (так, что Google не будет игнорировать точку) или если бы я знал терминологию для того, что называется такой тип конструкции, I Думаю, это может понять сам.

EDIT:

Оказывается, что я пытаюсь достичь, вероятно, лучше всего сделать с UserControl. Но, видимо, мне нужно изучить совершенно новый набор правил для создания UserControls в Silverlight.

Короче говоря, я хочу что-то вроде этого:

<CheckBox Click="myClickHandler" Name="myName"/><TextBlock Text="The label for the checkbox" /> 

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

Если кто-то хочет взломать какой-то быстрый код UserControl и опубликовать его, я был бы признателен. Если нет (и я полностью понимаю, что не хочу делать бесплатную работу для кого-то другого), я запустил Googling.

+0

Можете ли вы разместить свой код, который использовал этот стиль? – ChrisF

+0

Вы можете иметь текст как часть 'CheckBox' - использовать' Content = 'Метка для флажка "' – ChrisF

ответ

2

На первый взгляд, это правильный способ устранить проблему, и она кажется «другой случайной и произвольной разницей» между WPF и Silverlight. Однако внесение такого изменения фактически не приводит к созданию кода, который работает.

Как верно указывает Клай в своем последнем издании, ему действительно нужно сделать UserControl с Свойствами зависимостей для переменных частей (текст и т. Д.).

Вот ResourceDictonary page on MSDN, который имеет дополнительную информацию о формате.

Не забывайте, что Silverlight на самом деле не является подмножеством WPF. Microsoft пришлось полностью переписать код, который запускает приложения Silverlight, так что время выполнения - небольшая загрузка.

EDIT

Часть XAML вам нужно:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyControls"> 
    > 
    <Style TargetType="StackPanel"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <Control Template TargetType="local:myPanel"> 
        <CheckBox x:Name="myCheckBox" 
           Content="{TemplateBinding CheckBoxLabel}" 
           Margin="8,0,2,0" Width = "100"/> 
       </Control> 
      </Setter.Value> 
     </Setter>  
    </Style> 
</ResourceDictionary> 

Затем вам необходимо создать файл, содержащий CS код для пользовательского элемента управления:

namespace MyControls 
{ 
    public class myPanel : ContentControl 
    { 
     public myPanel() 
     { 
      DefaultStyleKey = typeof(myPanel); 
     } 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     CheckBox checkbox = GetTemplateChild("myCheckBox") as CheckBox; 
     checkbox.Click += CheckBoxClick; 
    } 

    void CheckBoxClick(object sender, RoutedEventArgs e) 
    { 
     CheckBox checkbox = sender as CheckBox; 
     // Do this CheckBox specific stuff 
    } 

    public string CheckBoxLabel 
    { 
     get { return (string)GetValue(CheckBoxLabelProperty); } 
     set { SetValue(CheckBoxLabelProperty, value); } 
    } 

    public static readonly DependencyProperty CheckBoxLabelProperty = 
     DependencyProperty.Register("CheckBoxLabel", typeof(string), 
            typeof(myPanel), null); 
} 

Отказ от ответственности. Я только что собрал это из более сложного пользовательского элемента управления, поэтому нет гарантии, что он будет работать «из коробки». Вам, вероятно, придется немного подкорректировать его, чтобы заставить его работать на 100%.

+0

Спасибо за быстрый ответ. Я приму этот ответ, если вы скажете мне, как я могу реструктурировать бит Style.Resources, чтобы избавиться от второй ошибки. – Klay

+0

Извините, я не заметил ваши изменения раньше. Благодаря! – Klay

+0

К сожалению. Слишком рано. Ошибка уходит в edito, но она дает ошибку времени выполнения: «Стиль не поддерживает стиль как контент. [Строка: 6 Позиция: 31]» – Klay

1

Я не уверен, что я буду беспокоить создание нового элемента управления, поскольку не требуется никаких новых функций, в очень худшем случае вам может понадобиться создать совершенно новый шаблон для CheckBox, если вы действительно хотите отправиться в город по пути выглядит. Однако я сомневаюсь, что вам даже нужно прикоснуться к шаблону в этом случае.

Свойство Padding заканчивается как свойство Margin внутреннего ContentPresenter шаблона по умолчанию. Если вы должны иметь ширину метки ровно 100 пикселей, вы можете установить ширину элемента управления флажком до 116 (флажок равен 16 пикселям).

Следовательно, ваши желаемые визуал можно подойти, как это с: -

<CheckBox x:Name="myName" Content="The label for the checkbox" 
    Margin="8 2 0 2" Padding="8 0 0 0" Width="116" /> 

Одно из ключевых различий с SL по сравнению с WPF вы не можете локально переопределить стиль для типа. Вам необходимо привязать свойство Style элемента управления к ресурсу: -

<UserControl .... blah, blah> 
    <UserControl.Resources> 
     <Style x:Key="MyCheckBoxes" TargetType="CheckBox"> 
      <Setter Name="Margin" Value="8 2 0 2" /> 
      <Setter Name="Padding" Value="8 0 0 0" /> 
      <Setter Name="Width" Value="116" /> 
     </Style> 
    </UserControl.Resources> 
    <CheckBox x:Name="myName" Content="The label for the checkbox" 
    Style="{StaticResource MyCheckBoxes}" /> 
Смежные вопросы