the_king
مدیرکل انجمن
در XAML چیزی اجرا نمیشه، زبان برنامه نویسی نیست که چیزی اجرا بشه. صرفا توصیف ئه. با همون ترتیب بالا به پایین پردازش میشه و میاد پایین. هی به بالا و پایین پرش نمی کنه، نمیشه که صفات تگ Application رو پردازش نکرده بپره به تگ ResourceDictionary داخلی و بعد مجددا برگرده به تگ بالایی.خیلی ممنون استاد .
استاد ، وقتی یه Resource ای در تگ ای تعریف میکنیم ، اول بخش Resource در اون تگ اجرا میشه و بعد خود همون تگ . درسته؟
مثلا در کد زیر :
XML:<Application x:Class="PoshtibangirTolo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PoshtibangirTolo" StartupUri="Elements\Windows\MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resource\Style_Template\StyleResource.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
اول بخش Resources اجرا و بنابراین StyleResource.xaml لود میشه و بعد کدهای بخش Application اجرا و StartupUri اجرا میشه . درسته؟
قاعدتا Binding ای که برای Stroke نوشته اید مشکلی نداره، همانطور که ایرادی در این مثال نیست :-------------------------------------------
و همچنین در کد زیر :
XML:<CustomControls:ShapeTextButton x:Name="CloseButton" DockPanel.Dock="Right" Margin="0,0,10,0" Width="24" Height="24"> <CustomControls:ShapeTextButton.Resources> <Path x:Key="CloseData" Data="M1,1 L23,23 M23,1 L1,23"/> </CustomControls:ShapeTextButton.Resources> <CustomControls:ShapeTextButton.DefaultButtonShape> <Path StrokeStartLineCap="Triangle" StrokeEndLineCap="Triangle" Stroke="{Binding ElementName=CloseButton, Path=Foreground}" StrokeThickness="2" Data="{Binding Source={StaticResource CloseData}, Path=Data}"/> </CustomControls:ShapeTextButton.DefaultButtonShape> </CustomControls:ShapeTextButton>
اگه بخوام پروپرتیِ Stroke ئه Path (که مربوط به مقدار پروپرتی DefaultButtonShape هست) را به پروپرتیِ Foreground ئه شیِ ShapeTextButton (که نامش CloseButton هست) متصل کنم ، :
چه کدی باید بنویسم؟
و همچنین چرا کد بالا (Binding اش) کار نمیکنه؟ (ارور نمیده اما عمل هم نمیکنه) .
XML:
<Grid>
<Button x:Name="CloseButton" Foreground="Red">
<Grid Width="50" Height="50">
<Ellipse Stroke="{Binding ElementName=CloseButton, Path=Foreground}" StrokeThickness="2"/>
</Grid>
</Button>
</Grid>
این مثال هم نشون میده که ایراد مربوط به RelativeSource نیست.و همچنین اگه بجای مشخص کردن ElementName در کد بالا (برای Binding) ، بخوام از RelativeSource استفاده کنم ، کدش چجوری میشه؟ کد را بصورت زیر نوشتم اما باز هم کار نکرد :
XML:Stroke="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type CustomControls:ShapeTextButton}}, Path=Foreground}"
XML:
<Grid>
<Button x:Name="CloseButton" Foreground="Red">
<Grid Width="50" Height="50">
<Ellipse Stroke="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}, Path=Foreground}" StrokeThickness="2"/>
</Grid>
</Button>
</Grid>