با سلام
من درون یک ریسورس دیکشنری استایل پنجره رو ساختم
درون اون از سه تا Grid.RowDefinitions استفاده کردم
اگر بخوام در اولی RowDefinitions خودم از MouseDown برای جابجائی فرم استفاده کنم دستورات اون رو باید در کجا بنویسم
ممنون
با سلام
من درون یک ریسورس دیکشنری استایل پنجره رو ساختم
درون اون از سه تا Grid.RowDefinitions استفاده کردم
اگر بخوام در اولی RowDefinitions خودم از MouseDown برای جابجائی فرم استفاده کنم دستورات اون رو باید در کجا بنویسم
ممنون
فرض کنیم که یک فایل XAML به عنوان ResourceDictionary تعریف کرده اید که اسمش Dictionary1 ئه (منوی Project گزینه ...Add Resource Dictionary)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1">
</ResourceDictionary>
ابتدا یک x:Class به اون ResourceDictionary اضافه می کنیم که مشخص کنه که کد کلاس کجا نوشته میشه، مثلا در فضای نام MyNamespace و کلاس Dictionary1 :
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
x:Class="MyNamespace.Dictionary1">
</ResourceDictionary>
حالا Style و Template اون Window رو داخل ResourceDictionary تعریف می کنیم، بخش مهم اون EventSetter ئه که میگه اگر روی اون Border که در "Grid.Row="0 قرار داره کلیک شد، باید متد SomeAction اجرا بشه که هنوز کدش رو ننوشته ایم :
urceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
x:Class="MyNamespace.Dictionary1">
<Style x:Key="MyStyle" TargetType="Window">
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Window">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition Height="4"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Background="LightBlue">
<Border.Style>
<Style TargetType="Border">
<EventSetter Event="MouseDown" Handler="SomeAction"/>
</Style>
</Border.Style>
</Border>
<Border Grid.Row="1">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="DeepSkyBlue" Offset="0.0" />
<GradientStop Color="White" Offset="0.25" />
<GradientStop Color="DeepSkyBlue" Offset="0.75" />
<GradientStop Color="White" Offset="1.0" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Border Grid.Row="2" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}">
<ContentPresenter/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
من نام Style رو MyStyle در نظر گرفتم.
حالا یک کلاس Dictionary1 رو می سازیم (منوی Project گزینه ...Add Class)، اگر نام فایل ResourceDictionary ئه Dictionary1.xaml باشه، باید نام فایل کلاس رو Dictionary1.xaml.cs بدهیم :
using System;
using System.Windows;
using System.Windows.Controls;
namespace MyNamespace
{
public partial class Dictionary1 : ResourceDictionary
{
public void SomeAction(object sender, EventArgs e)
{
Window.GetWindow((Border)sender).DragMove();
}
}
}
این کد میگه وقتی SomeAction اجرا شد (روی اون Border دکمه ماوس فشار داده شد) پنجره رو DragMove کنه. دقت کنید که فضای نام رو MyNamespace تعریف کرده ایم و در اون ResourceDictionary هم "x:Class="MyNamespace.Dictionary1 رو توصیف کردیم که به همین کلاس اشاره داره.
حالا فایل App.xaml پروژه رو باز می کنیم و ResourceDictionary مون رو به <Application.Resources> اضافه می کنیم :
<Application x:Class="WpfApp1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary Source="Dictionary1.xaml" />
</Application.Resources>
</Application>
حالا در پنجره مورد نظر از این Style ای که ساختیم استفاده می کنیم :
<Window x:Class="WpfApp1.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:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Style="{StaticResource MyStyle}">
<Grid>
</Grid>
</Window>
ممنون دوست عزیز
از لطف شما سپاسگذارم
امتحان میکنم هرجا با مشکل برخوردم مزاحم میشم
ممنون
با سلام
و تشکر ویژه برای آموزش
من از روش شما برای ساخت و استفاده از ریسورس دیکشنری استفاده کردم
حالا میخواستم بدونم برای یادگیری کارهای دیگه
مثل MouseMove برای تغییر Opacity
یا دستور Close برای بسته شدن فرم
و هر کار دیگه از کجا میتونم
اون رو یاد بگیرم
ممنون از لطفتون
آخرین ویرایش به وسیله MMRavari : یک شنبه 26 مرداد 1399 در 05:08 صبح
با سلامفرم جدید رو مطابق آموزشتون در ResourceDictionery ساختم و فایل و ضمیمه کردمولی با چند مشکل روبرو شدم1. اول اینکه بعضی وقتا با ارور زیر روبرو میشم علتش و چه جوری باید اون رو برطرف کرد
'ResourceDictionary' root element requires a x:Class attribute to support event handlers in the XAML file. Either remove the event handler for the MouseDown event, or add a x:Class attribute to the root element. Line 26 Position 68.
1. دوم اینکه من برای Title از دو عکس و یک نوشته استفاده کردم و opacity گرید رو به 0.5 تغییر دادم اگر بخوام رویداد MouseMove رو برای اون تعریف کنم چطوری میتونم2. هم چنین برای هر کدوم از متغیرهای موجود در Title نامی منظور کردم اگر بخوام در موقع استفاده از این ResourceDictionery مقادیر جدیدی روبراشون اعمال کنم از چه دستور باید استفاده کنمپیشاپیش از کلیه دوستان که در این تاپیک کمک میکنن کمال تشکر رو دارمممنون
قسمت 78 آموزش دسترسی به المنت ها روی دیکشنری هست
https://www.daneshjooyar.com/%d8%a2%...d%d9%88%d8%b1/
ممنونم دوست عزیز
ولی این آموزش در صف انشار هست
من درخواستم رو برای خرید فرستادم
ولی اکنون با مشکل روبرو هستم
ممنون میشم راهنمایی کنید
سلام
شما اون چیزی را که استاد در پست 2 گفتن ، خیلی ها را رعایت نکردین .
چندین کد را ننوشتین ، فایل ها را به اون نام ای که استاد گفتن ، rename نکردین ، کدهایی را بدون در نظر گرفتن شرایط ، اضافه کردین و ... .
اول اینکه ، کد های :
xmlns:local="clr-namespace:WpfApp1"
x:Class="MyNamespace.Dictionary1"
را که استاد گفتن ، در کدتون وجود نداره .
بعد نام فایل ها و همچنین نام فضای نام و نام کلاس هایی (مثل همین نام کلاس Dictionary1) را ، یه چیز دیگه گذاشتین ، بدون اینکه شرایطی که استاد برای rename اش توضیح دادن را رعایت کنین .
سر آخر هم علاوه بر اون border ، یه grid دیگه در بخش caption فرم تون گذاشتین (همون بخش Grid.Row="0" ئه گرید اصلی) که این گرید ، اون border را پوشش میده . اگه گرید دیگه ای میخواین قرار بدین ، برای رویداد این گرید ، کد بنویسین نه برای رویداد اون border .
چون چندین مورد تغییرات هستن ، تغییرات پروژه تون را در زیر پیوست میکنم (لطفا دقت کنید اون توضیحاتی که طرف مقابل تون میدن . چون خیلی از توضیحات استاد را اصلا رعایت و پیاده سازی نکردین . تشکر) .
این روش استاندارد نیست حداقل تو پروژه های خود مایکروسافت و سایر شرکت ها استفاده نمیشه و من هم جایی ندیدم که به این صورت بخوان به المنت های دیکشنری دسترسی داشته باشن!!
براتون داخل پروژه اصلاح کردم
درضمن این کاری که کردید رو با یه attached property براحتی میشه انجامش داد و خوبی که این روش داره شما میتونی با هر المنتی عملیات درگ رو انجام بدید کافیه پراپرتی رو true کنید
براتون یه ویندو2 ایجاد کردم که با این اتچ پراپرتی کار میکنه میتونید تست کنید
http://uupload.ir/view/nvp5_projectlist.zip/
از هر دو بزرگوار ممنونم
من رشتم کامپیوتر نیست و برای حل مشکلاتم دارم از برنامه نویسی استفاده میکنم
قبلأ هم درخواست من آموزش برای اینکار بود
به هر حال از هر دوی شما بسیار سپاسگذارم
حتمأ مطالبی رو که فرمودین بررسی میکنم
با سپاس فراوان
فقط اینکه کد فایل WindowStyle.xaml را به اینی که در زیر مینویسم ، جایگزین کنید چون ContentPresenter را اضافه کردم وگرنه محتوایی را نمیتونید اضافه کنید :
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ProjectList"
x:Class="ProjectList.WindowTemplate">
<Style x:Key="MainWindow" TargetType="{x:Type Window}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="FlowDirection" Value="RightToLeft"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0" CornerRadius="15,15,0,0" Background="SkyBlue">
<!--<Border.Style>
<Style TargetType="{x:Type Border}">
<EventSetter Event="MouseDown" Handler="WinMove"/>
</Style>
</Border.Style>-->
</Border>
<Grid x:Name="grdTitle" Grid.Row="0" Opacity="0.5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40"/>
<ColumnDefinition/>
<ColumnDefinition Width="40"/>
</Grid.ColumnDefinitions>
<Image x:Name="imgTitle" Source="/Img/15.png" Margin="5"/>
<Label x:Name="lblTitle" Content="فرم اصلی" FontSize="24" Grid.Column="1" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
<Image x:Name="imgExit" Grid.Column="2" Source="/Img/exit1.png" Margin="5"/>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<EventSetter Event="MouseDown" Handler="WinMove"/>
</Style>
</Grid.Style>
</Grid>
<Border Grid.Row="1" Background="#FFFFFFFF" CornerRadius="0,0,15,15">
</Border>
<ContentPresenter Grid.Row="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
ضمنا ، بجای اون کد ، پیشنهاد میکنم که فایل WindowTemplate.xaml.cs تون را به WindowStyles.xaml.cs تغییر نام بدید (که استاد گفته بودن) (هم نام با فایل xaml تون که هر چی هست اما پسوندش ، پسوند سی شارپ باشه) . در پروژه ای که بهتون دادم ، این کار را نکردم .
با این کار ، پیچیدگی همون کد ، کم میشه و نیاز به حتی اون کد هم نیست و مثل حالت عادی که در xaml برای ویندوز اصلی کد مینوشتین ، برای این فایل هم میتونین همینطوری کد بنویسین . (یعنی رویدادها را در لیست اینتلیسنس تون خواهید داشت) .
بنابراین اگه فایل تون را به این ، تغییر نام دادین ، میتونین کد زیر را جایگزین کد قبلی تون کنید (دیگه نیازی به استفاده از EventSetter برای تنظیم رویداد نیست) :
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ProjectList"
x:Class="ProjectList.WindowTemplate">
<Style x:Key="MainWindow" TargetType="{x:Type Window}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="FlowDirection" Value="RightToLeft"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.Row="0" CornerRadius="15,15,0,0" Background="SkyBlue">
</Border>
<Grid MouseLeftButtonDown="grdTitle_MouseLeftButtonDown" x:Name="grdTitle" Grid.Row="0" Opacity="0.5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40"/>
<ColumnDefinition/>
<ColumnDefinition Width="40"/>
</Grid.ColumnDefinitions>
<Image x:Name="imgTitle" Source="/Img/15.png" Margin="5"/>
<Label x:Name="lblTitle" Content="فرم اصلی" FontSize="24" Grid.Column="1" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
<Image x:Name="imgExit" Grid.Column="2" Source="/Img/exit1.png" Margin="5"/>
</Grid>
<Border Grid.Row="1" Background="#FFFFFFFF" CornerRadius="0,0,15,15">
</Border>
<ContentPresenter Grid.Row="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
و در فایل WindowStyles.xaml.cs تون هم فقط کافی هه هندلر رویداد را بصورت مستقیم ، کد بنویسین :
using System;
using System.Windows;
using System.Windows.Controls;
namespace ProjectList
{
public partial class WindowTemplate :ResourceDictionary
{
private void grdTitle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Window.GetWindow((Grid)sender).DragMove();
}
}
}
ممنون دوست عزیز
اینکار رو برای فرمم میکنم
اما مشکل باقیمونده مربوط به Opacity برای هستTitle
ممنون میشم راهنمایی کنید
اگر کتابی که اصولی باد داده باشه هم میشناسید ممنون میشم معرفی کنید
باز از لطف شما ممنون
نه دوست خوب
من اومدم opacity کل Group مربوط به هدر رو کم کردم
که شامل دو تصویر و نوشت مرکز اون هست
میخوام با قرار گیری Mouse در روی اون Group تمامی
اونها شفاف بشن
مرسی
بقیه ی موارد ، مثل حالت عادی هه دیگه .
در همون گرید ای که شفافیت اش را کم کردین ، رویداد MouseEnter و MouseLeave بسازین و کدها را توش بنویسین (در حالتی میتونین این کار را کنین که چیزهایی که در پست شماره 12 گفته شد (تغییر نام اون فایل) را انجام بدین ) .
بعد از ساختن اون دو رویداد ، کد داخل این رویدادها که دیگه کاری نداره :
((Grid)sender).Opacity = 0.2;
من کاری رو که گفتین انجام دادم اما
Opacity کل فرم کم و زیاد میشه
من میخواهم Opacity فقط Header فر تغییر کنه
برای خروج چه دستوری میشه نوشت
ممنون
داخل همون کنترل که میخاید opacity تغییر کنه یه تریگر بنویسید به جای بوردر اسم کنترل خودتون بنویسید
شما اینجور کار هارو باید با همون تریگر انجام بدید و درگیر سی شارپ نشید
<Border.Style>
<Style>
<Setter Property="Opacity" Value="1"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value=".2" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
گلپسر ، فارسی نوشتم دیگه .
در پست 12 گفتم که نام فایلِ WindowTemplate.xaml.cs تون را به WindowStyles.xaml.cs تغییر نام بدید . اما کماکان نام فایل تون همون WindowTemplate.xaml.cs هست .
کد تغییر opacity را که بهتون در پست قبلی (پست 16) دادم دیگه :
public void MouseEnter(object sender, EventArgs e)
{
((Grid)sender).Opacity = 0.2;
}
public void MouseLeave(object sender,EventArgs e)
{
((Grid)sender).Opacity = 1;
}
با تشکر از دوستان
جناب آقای barnamenevisjavan من کاری رو که فرمودین انجام دادم
ولی باز هم با ورود موس به فرم Opacity هدر فرم تغییر میکنه
من میخوام وقتی موس روی هدر قرارگرفت Opacity تغییر کنه
جناب آقای SajjadKhati از لطف شما هم ممنون ولی دوست خوب
اگر توی فایل ارسالی ببینی من هون کار رو انجام دادم
ولی تغییرات در زمان ورود موس به فرم انجام میشه
من که فایل رو ضمیمه میکنم
مرسی
خوب حرف گوش نمیکنی که
این کد رو بزار داخل گرید لازم نیست داخل تریگر controltemplate بنویسی
درضمن اون مقدار opacity که برای گرید ست کردی رو هم باید حذفش کنی تا تریگر درست کار کنه
نکته بعدی اینکه برای حالت دوم (false یا true) نیاز نیست دوباره تریگر بنویسی الان تریگر زیر هم برای حالت true هست هم false
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Opacity" Value="1"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value=".2" />
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
فایل ارسالی تون را دیدم که پست قبلی را دادم .
همین پست قبلی تون و هم این پست ، در هیچ کدوم از فایل ارسالی ، چیزهایی که گفتم را عملی نکردین . 2 تا چیز ساده گفتم . نه فایل را تغییر نام دادید و نه یه خط کدی که بهتون دادم را در اون رویداد نوشتید .
آموزش سی شارپ و wpf را پیگیری کنید (قبلا هم که لینک خواستید و بهتون دادم) .
پروژه ای که تغییراتی که گفتم را در زیر پیوست میکنم (اون 2 فایل را بذارید کنار هم توی یه پوشه باشن و توی پوشه های مختلف نذارید . فایل WindowStyles.xaml.cs و WindowStyles.xaml) :
از هر دو بزرگوار ممنونم
لطف کردین
سپاس فراوان