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

时间:2012-02-19 07:41:30

标签: silverlight

我正在阅读Pro 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>

2 个答案:

答案 0 :(得分:2)

戴夫S,绝对正确。您可以看到Z-Index问题颠倒了控件的顺序(因此TextBlock位于Slider之前) - 然后它将起作用,因为滑块将位于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-Index由XAML中控件的顺序决定。

绕过此(或演示)的另一种方法是明确指定Z-Index附加属性:

<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行,因此它们不再重叠。

答案 1 :(得分:0)

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