سئوالات و مباحث WPF

rahaomidi

Member
سلام
توی wpf که میریم ، کد زیر را مینویسه :


کد:
<Window x:Class="WPF_Practice.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
      
    </Grid>
</Window>

چندین سئوال دارم :
1) اون اولش که نوشته Window ، یعنی شی ای از کلاس Window دیگه درسته؟

2) بعدش که نوشته :

کد:
x:Class="WPF_Practice.MainWindow"
یعنی بجای اینکه از Window شی درست کنه ، از کلاس در فضای نام گفته شده (کلاس MainWindow) شی درست کنه . درسته؟ و بعد اینکه کلمه ی x که در بالا نوشت یعنی چه؟ متغییر هه؟ عملگر نقل قول : که در بالا نوشت هم یعنی چه؟ کلمه ی Class هم که نوشت ، زمانی میاد که بخوایم شی ای از یه کلاس را جایگزین کنیم؟ یعنی اینکه اول گفت شی ای از کلاس Window ، اما چون میخواد شی از کلاس فرزند ویندوز میخواد بسازه ، کلمه ی Class را آورد تا بگه که میخواد از فرزندش (که MainWindow هست) شی بسازه و نه اینکه شی از کلاس Window بسازه؟
پس چرا مثل کلاس های دیگه وقتی میخواد از کلاس MainWindow شی بسازه ، مستقیما همون اول بجای کلمه ی Window از کلمه ی MainWindow نام نبرد؟

3) من این خط ها را کلا متوجه نشدم :

کد:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"
هم کلماتی مثل xmlns . اینها متغییر هستن؟ و هم عملگرهایی مثل نقل قول و رابطه ی کلماتی که قبل از نقل قول و کلماتی که بعد از نقل قول میان مثل xmlns:x
و بعدش اینکه چرا آدرس و لینک وب را میده؟! مثلا آدرس "http://schemas.microsoft.com/winfx/2006/xaml/presentation" به چه معناست؟ لینک وب میده که چی بشه؟

4) و همینطور این دو خط زیر را متوجه نشدم :


کد:
xmlns:local="clr-namespace:WPF_Practice"
        mc:Ignorable="d"

خط بعدش (Title و ...) را متوجه شدم
آخر هم اینکه چرا شی ای از Grid را اتوماتیک میسازه؟ خوب هر وقت کاربر خواست ، خودش کنترل Grid را مثل بقیه ی کنترل ها اضافه میکنه دیگه
ممنون
  1. بله، اولین خط کد یک شی از کلاس Window را تعریف می‌کند.
  2. کلمه‌ی x در اینجا به معنای namespace است و برای تعریف namespace در XAML استفاده می‌شود. کلمه‌ی Class نیز برای تعیین نام کلاسی است که این شی از آن ساخته می‌شود. در اینجا، کلاس MainWindow از کلاس Window ارث‌بری کرده است و بنابراین می‌توان از آن به عنوان یک شی از کلاس Window استفاده کرد. کلمه‌ی xmlns نیز برای تعریف namespace در XAML استفاده می‌شود و معمولاً با یک پیشوند مشخص می‌شود. در اینجا، پیشوند x برای namespace مربوط به XAML استفاده شده است.
  3. کلمه‌ی xmlns به معنای XML namespace است و برای تعریف namespace در XAML استفاده می‌شود. آدرس و لینک وب مربوط به namespace مربوطه است و برای تعیین محل قرارگیری namespace استفاده می‌شود. برای مثال، آدرس "http://schemas.microsoft.com/winfx/2006/xaml/presentation" برای namespace مربوط به Presentation Framework در WPF استفاده می‌شود.
  4. xmlns:local برای تعریف namespace محلی استفاده می‌شود که در آن، کلاس‌هایی که در همان پروژه تعریف شده‌اند، قرار دارند. mc:Ignorable نیز برای تعیین عناصری است که در آن‌ها خطاهایی که ممکن است در آن‌ها وجود داشته باشد، نادیده گرفته شود. شی از کلاس Grid به عنوان یک container برای قرار دادن کنترل‌های دیگر درون آن استفاده می‌شود.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
تشکر


مثال ساده از مدیریت خطا در بایندینگ :

XML:
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Name="txtValue"
            Text="{Binding Path=Value, NotifyOnValidationError=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
            
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}">
                    <Binding ElementName="txtValue" Path="(Validation.Errors)[0].ErrorContent"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>

و

C#:
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private int _value;
    public int Value
    {
        get { return _value; }
        set
        {
            if (value < 0)
                throw new Exception("Value cannot be negative.");
            _value = value;
            OnPropertyChanged("Value");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

پروپرتی Validation.Errors ، یک attached property ای هست که در کنترل و المنت ای اجرا میشه که پروپرتی ای از اون کنترل ، Binding شده باشه و در اون Binding ، خطای اعتبارسنجی ای رخ بده .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اجرای هم کلیک و هم Command از xaml و سی شارپ (بدون فراخوانی مستقیم کامند از سی شارپ) :


دقت شود که زمانی که هم رویداد کلیک و هم پروپرتی Command مقدار دارد ، رویداد کلیک ، زودتر از Command اجرا میشود .
پس میتوانیم در هندلر رویداد کلیک ، پروپرتیِ CommandParameter را تنظیم کنیم تا بعدش که Command اجرا میشود ، پارامتر مورد نظرش هم ارسال شود .
به این ترتیب نیازی به فراخوانی Command از درون رویداد نیست .

XML:
                <MenuItem Name="LoadingMenuItem" Header="بارگذاری" Click="LoadingMenuItem_Click"
                    Command="{Binding Path=AddItemsToImagePathsFromFolderCommand}"/>

و :

C#:
        private void LoadingMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.LoadImagePaths();
        }

        private void LoadImagePaths()
        {
            string selectedFolderPath = this.ShowFolderDialog();
            if (string.IsNullOrEmpty(selectedFolderPath) == true)
                return;

            this.LoadingMenuItem.CommandParameter = selectedFolderPath;
        }
 
بالا