2010-01-28 2 views
2

В следующем приложении Silverlight почему свойство OuterPadding не изменяет отступы на внешней границе, хотя TextBlock правильно отображает значение OuterPadding? Если я поменю Border padding на простое целое число, то добавление работает отлично, но не тогда, когда оно определяется свойством в коде позади.Почему TextBlock показывает значение свойства code-behind, но border/padding не может его использовать?

Этот же код отлично работает в WPF.

XAML:

<UserControl x:Class="Test222.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:pages="clr-namespace:Test222.Pages" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    Width="600" Height="480"> 
    <Border Background="#eee" Padding="{Binding OuterPadding}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="34"/> 
       <RowDefinition Height="426"/> 
      </Grid.RowDefinitions> 
      <StackPanel Grid.Row="0" Grid.Column="0"> 
       <StackPanel x:Name="QuickMenu" Orientation="Horizontal"/> 
      </StackPanel> 
      <Border Grid.Row="1" Grid.Column="0" 
       Background="#fff" 
       Padding="10" 
       Width="580" 
       Height="426" 
       VerticalAlignment="Top" 
       CornerRadius="5"> 
       <TextBlock Text="{Binding OuterPadding}"/> 
      </Border> 
     </Grid> 
    </Border> 
</UserControl> 

Код За:

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace Test222 
{ 
    public partial class MainPage : UserControl, INotifyPropertyChanged 
    { 

     #region ViewModelProperty: OuterPadding 
     private int _outerPadding; 
     public int OuterPadding 
     { 
      get 
      { 
       return _outerPadding; 
      } 

      set 
      { 
       _outerPadding = value; 
       OnPropertyChanged("OuterPadding"); 
      } 
     } 
     #endregion 

     public MainPage() 
     { 
      InitializeComponent(); 
      DataContext = this; 

      RefreshApplication(); 
     } 

     void RefreshApplication() 
     { 
      OuterPadding = 5; 


      for (int i = 0; i < 5; i++) 
      { 
       var button = new Button(); 
       button.Content = "Button " + i; 
       button.Margin = new Thickness { Right = 3 }; 
       QuickMenu.Children.Add(button); 
      } 
     } 


     #region INotifyPropertyChanged Member 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     #endregion 

    } 
} 

ответ

2

int работает при определении значения в xaml, но когда вы делаете это в коде, это не так. Но если вы измените свою собственность от int до ThickNess, она отлично работает.

+0

Использование int в коде работает в WPF, но, по-видимому, не в Silverlight (3). Толщина работает в обоих. Забавно, что с использованием int в коде в Silverlight на самом деле сбой Visual Studio (2008) на одной машине. –

1

Если бы я должен был догадаться, я бы сказал, что его, потому что значение конвертер для толщины не обрабатывает Int32 -> Толщина преобразование. Что произойдет, если вы сделаете OuterPadding a Thickness вместо int?

EDIT Только что проверил Отражатель и, кажется ThicknessConverter закодирована для обработки преобразования из любой строки или Double в толщину, но не Int32.

Я неправильно понял, что видел в рефлекторе. Похоже, он должен обрабатывать Int32 ok.