2

次の Silverlight アプリケーションでは、TextBlock が OuterPadding の値を正しく表示しているにもかかわらず、プロパティ OuterPadding が外側の境界線のパディングを変更しないのはなぜですか? Border パディングを単純な整数に変更すると、パディングは正常に機能しますが、コード ビハインドのプロパティで定義されている場合は機能しません。

この同じコードは、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

    }
}
4

2 に答える 2

2

xaml で値を定義する場合は int が機能しますが、コードで定義する場合は機能しません。ただし、プロパティを int から ThickNess に変更すると、正常に機能します。

于 2010-01-28T08:41:37.933 に答える
1

推測する必要がある場合は、Thickness の値コンバーターが Int32 -> Thickness 変換を処理しないためです。OuterPadding を int ではなく Thickness にするとどうなりますか?

編集Reflectorをチェックしたところ、ThicknessConverterはStringまたはDoubleからThicknessへの変換を処理するようにハードコードされているようですが、Int32ではありません。

Reflector で見たものを誤解していました。Int32 を正常に処理できるようです。

于 2010-01-28T06:28:37.590 に答える