SajjadKhati
کاربر فعال <A href="http://forum.majidonline.com/f
روی دکمه btnLevel_1 کلیک می کنید، به سمت بالا و والدین اش پیمایش می کنه و چیزی برای اجرا کردن برای رخداد کلیک پیدا نمی کنه و CommonClickHandler هم اجرا نمیشه.
روی دکمه btnLevel_2 کلیک می کنید، به سمت بالا و والدین اش پیمایش می کنه و چیزی برای اجرا کردن برای رخداد کلیک پیدا نمی کنه و CommonClickHandler هم اجرا نمیشه.
روی دکمه btnLevel_3 کلیک می کنید، به سمت بالا و والدین اش پیمایش می کنه و ButtonBase.Click رو در همون شروع پیمایش در المنت خودش می بینه و CommonClickHandler اجرا میشه.
روی دکمه btnLevel_4 کلیک می کنید، به سمت بالا و والدین اش پیمایش می کنه و ButtonBase.Click رو در المنت والدش پیدا می کنه و CommonClickHandler اجرا میشه.
چه چیزی در پیمایش این رخداد ها به سمت پایین بود؟ روی btnLevel_1 که کلیک می کنید ButtonBase.ClickButtonBase.Click رو در پایین و فرزندانش پیدا می کنه و CommonClickHandler اجرا میشه؟
خیلی ممنون استاد
آها ، منظورتون اینه که وقتی رویدادی در کنترلی اتفاق میافته ، اگه استراتژی حباب را داشته باشه ، توی هر کنترلی که اون اتفاق افتاد ، به سمت بالا (به سمت والدش) پیمایش میکنه و اگه کدی که مرتبط با اون رویداد هست (از نوع Routed Event و استراتژی حباب) را در کنترل والدش دید ، اون رویداد را فقط اجرا میکنه (متصل و اضافه نمیکنه) . منظورتون اینه؟
بنابراین :
وقتی روی دکمه btnLevel_1 کلیک می کنیم ، به سمت بالا و والدین اش پیمایش می کنه و چون در هیچ یک از والدش ، اولا کنترلی از نوع ButtonBase (یا از نوع فرزندانش) وجود نداره و دوما اگه کنترلی از این نوع وجود میداشت ، باید رویدادِ ButtonBase.Click ئه مربوط به اون کنترل ، مقداردهی میشد تا در مسیرِ پیمایشِ btnLevel_1 که افتاد ، اون رویداد را اجرا کنه (نه اینکه متصل و اضافه کنه . مثل متد که فقط اجرا میشه) .
همچنین وقتی روی دکمه btnLevel_2 کلیک می کنیم ، به سمت بالا و والدین اش پیمایش می کنه . والدش که btnLevel_1 باشه ، از نوع ButtonBase هست اما چون در شی btnLevel_1 ، رویداد ButtonBase.Click ای مقداردهی نشد ، پس رویدادی اصلا در والدش وجود نداره که اون را اجرا کنه .
دکمه btnLevel_3 که معلومه . وقتی روش کلیک میکنیم ، اول ، خود همون رویدادِ ButtonBase.Click که درون خودِ همین شی مقداردهی کردیم ، اجرا میشه . بعد به سمت والدش میره که برای هیچ کدوم از والدهاش (یعنی شی btnLevel_1 و btnLevel_2) ، رویداد ButtonBase.Click مقداردهی نشد .
وقتی روی دکمه btnLevel_4 کلیک می کنیم ، به سمت بالا و والدین اش که دکمه ی btnLevel_3 باشه ، پیمایش می کنه و چون در این دکمه ، رویداد ButtonBase.Click مقداردهی شد ، پس این رویداد را اجرا میکنه (نه اینکه متصل کنه) .
نکته ی مهم اینه که Source ، همون شی ای هست که در حال پیمایش کردن هست . مثلا وقتی روی شی btnLevel_3 کلیک میکنیم ، چون این شی ، در حال پیمایش کردن به سمت والدین هست ، پس Source مون در این لحظه ، همین شی (btnLevel_3) هست . وقتی هم که روی شیِ btnLevel_4 کلیک میکنیم ، چون این شی در حال پیمایش کردن به سمت والدین اش هست ، پس Source مون در این لحظه ، همین شی (btnLevel_4) هست .
اما sender ، اون شی ای هست که در Xaml (یا سی شارپ) ، اون رویداد را براش نوشتیم . یعنی در مثالی که گفته شد ، همیشه ، sender مون ، شی btnLevel_3 هست (چون رویداد ButtonBase.Click را در این شی نوشتیم) .
در واقع ، وقتی btnLevel_4 ، در مسیر پیمایش به سمت بالا ، به btnLevel_3 رسید ، به شی btnLevel_4 اطلاع میده که رویدادِ ButtonBase.Click اش را اجرا کنه (یعنی خودِ شیِ btnLevel_4 ، اجرا کننده ی رویدادِ ButtonBase.Click در شی btnLevel_3 نیست) و چون شیِ btnLevel_3 ، رویداد را اجرا میکنه ، پس sender مون ، همون شیِ btnLevel_3 هست اما Source مون ، شیِ btnLevel_4 هست .
بنابراین ، در کد زیر :
کد:
<Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Name="btnLevel_1" Margin="20">
<Button ButtonBase.Click="CommonClickHandler" Name="btnLevel_2" Background="DarkCyan" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Margin="100">
<Button ButtonBase.Click="CommonClickHandler" Name="btnLevel_3" Margin="50,50" Width="550" Height="200" Background="DarkKhaki" HorizontalContentAlignment="Left" VerticalContentAlignment="Top">
<Button Name="btnLevel_4" Margin="70, 30" Width="400" Height="130" Background="DarkMagenta" HorizontalContentAlignment="Left" VerticalContentAlignment="Top">
</Button>
</Button>
</Button>
</Button>
وقتی روی دکمه ی btnLevel_3 کلیک میکنیم ، اول ، رویدادِ ButtonBase.Click ئه مربوط به خودش را اجرا میکنه و بعد ، والدش را پیمایش میکنه و میبینه توی والدِ btnLevel_2 اش هم یه رویدادِ ButtonBase.Click وجود داره که این را هم مجددا اجرا میکنه (در واقع ، 2 بار در کد بالا به این دلیل ، برای این شی و همینطور شی btnLevel_4 ، رویداد اجرا میشه) .
اینهایی که در بالا گفتم ، درستن؟
و یک چیز دیگه اینکه وقتی ، هر رویدادِ مربوط به Routed Event در یک کنترل (و شی) اتفاق بیافته (صرف نظر از اینکه اون رویداد را برای اون کنترل در xaml یا سی شارپ نوشته باشیم یا ننوشته باشیم) ، باعث میشه اون شی و کنترل ، والدش را اجرا کنه؟
یعنی مثلا در کد اولی (نه کد بالا . بلکه کد اولی در پست 197) ، برای کنترل های btnLevel_1 و btnLevel_2 ، رویداد ButtonBase.Click را مقداردهی نکردیم . اما با این حال ، وقتی روی این دو کنترل کلیک کنیم ، باز باعث میشه که این کنترل ها ، والدشون را به سمت بالا (در صورت داشتنِ استراتژی حباب) پیمایش کنن؟ یا اینکه صرفا هر کنترلی را که روش کلیک کردیم و باز هم اگه رویدادِ Routed Event ده مربوط به اون کنترل را مقداردهی کرده باشیم (مثل رویداد ButtonBase.Click) ، در این صورت فقط پیمایش میکنن؟
اینکه رویداد Click توانایی routing داشته باشه که مشکلی نیست، routing اش اختیاری است، می توانید بگید نکنه.
باید تاپیک Routed Events رو بخونید، نخوندید که، اگه میخوندید سوال نمی پرسیدید. براتون مثال کد هم نوشته بود.
در حال خوندن هستم .
تا قسمت How Routed Events Are Implemented اش را خوندم و این مشکلات را داشتم که مطرح کردم .
انگار با ست کردنِ پروپرتیِ e.Handled به true در رویداد (هندلر) ، دیگه از اون به بعد ، پیمایش انجام نمیده .
نمیفهمم چی میگید، ظاهرش مگه چطوری میشه که میگید شانسی ئه؟
جوابش را در پست 198 تون دادید و متوجه شدم .
خیلی ممنون استاد