为什么Pro Silverlight 4书中的这个例子不起作用?

为什么Pro Silverlight 4书中的这个例子不起作用?,silverlight,Silverlight,我正在读一本支持Silverlight 4的书(http://my.safaribooksonline.com/book/programming/csharp/9781430229797/xaml/element-to-element_binding),我做了书中所有的例子。但是绑定一章中的一个例子对我不起作用。编译并运行应用程序后,滑块不会移动: <UserControl x:Class="SilverlightApplication14.MainPage" xmlns="http://

我正在读一本支持Silverlight 4的书(http://my.safaribooksonline.com/book/programming/csharp/9781430229797/xaml/element-to-element_binding),我做了书中所有的例子。但是绑定一章中的一个例子对我不起作用。编译并运行应用程序后,滑块不会移动:

<UserControl
x:Class="SilverlightApplication14.MainPage"
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"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
<Grid
    x:Name="LayoutRoot"
    Background="White">
    <Slider
        x:Name="sliderFontSize"
        Margin="3"
        Minimum="1"
        Maximum="40"
        Value="10"></Slider>
    <TextBlock
        Margin="10"
        Text="Simple Text"
        x:Name="lblSampleText"
        FontSize="{Binding ElementName=sliderFontSize, Path=Value}"></TextBlock>
</Grid>


滑块和文本块都位于网格中的相同位置(0,0)。这意味着TextBlock直接显示在滑块顶部,因此任何鼠标事件都将始终由TextBlock而不是滑块捕获。这是隐含的,因为TextBlock通过在网格中第二个位置定义而具有更高的Z索引。如果重新排列网格,并将
Grid.Row=“1”或
Grid.Column=“1”
应用于文本块,使其位于滑块控件旁边,则应该能够成功使用滑块。

Dave S绝对正确。您可以看到Z索引问题颠倒了控件的顺序(因此TextBlock在滑块之前)-然后它会工作,因为滑块将位于TextBlock的顶部:

<Grid 
x:Name="LayoutRoot" 
Background="White">
    <TextBlock 
    Margin="10" 
    Text="Simple Text" 
    x:Name="lblSampleText" 
    FontSize="{Binding ElementName=sliderFontSize, Path=Value}"></TextBlock>
    <Slider 
    x:Name="sliderFontSize" 
    Margin="3" 
    Minimum="1" 
    Maximum="40" 
    Value="10"></Slider>
</Grid>

您可以在这里看到,Z索引是由XAML中控件的顺序决定的

另一种方法(或演示)是明确指定附加的属性:

<Grid 
x:Name="LayoutRoot" 
Background="White">
    <Slider 
    x:Name="sliderFontSize" 
    Margin="3" 
    Minimum="1" 
    Maximum="40" 
    Value="10" Canvas.ZIndex="1"></Slider>
    <TextBlock 
    Margin="10" 
    Text="Simple Text" 
    x:Name="lblSampleText" 
    FontSize="{Binding ElementName=sliderFontSize, Path=Value}"></TextBlock>
</Grid>

解决此问题的最佳方法是将元素放在不同的行中,以确保元素不会相互重叠:

<Grid 
x:Name="LayoutRoot" 
Background="White">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Slider Grid.Row="1" 
    x:Name="sliderFontSize" 
    Margin="3" 
    Minimum="1" 
    Maximum="40" 
    Value="10"></Slider>
    <TextBlock
    Margin="10" 
    Text="Simple Text" 
    x:Name="lblSampleText" 
    FontSize="{Binding ElementName=sliderFontSize, Path=Value}"></TextBlock>
</Grid>

在此示例中,TextBlock位于第0行,滑块位于第1行,因此它们不再重叠