2

Viewport3D2 つの照明条件を交互に切り替えたい があります。各ライト条件は、Model3DGroup1 つまたは複数のライト ( 、 など) を含むDirectionalLightAmbientLightなります。

を使用する予定ですが、直接の親 ( ) にはプロパティがないDataTriggerため、どのオブジェクトとどのプロパティを使用すればよいかわかりません。以下のコードのように、それ自体でプロパティを使用すると、ターゲットが認識されません。Model3DGroupModelVisual3DStyleStyleViewport3DSetter.TargetName

<CheckBox x:Name="shadows" Content="Shadows" />
<Viewport3D>
    <Viewport3D.Resources>
        <Model3DCollection x:Key="shaded_light">
            <DirectionalLight Color="White" Direction="-1,-1, -10" />
        </Model3DCollection>
        <Model3DCollection x:Key="solid_light">
            <AmbientLight  Color="White" />
        </Model3DCollection>
    </Viewport3D.Resources>
    <Viewport3D.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=shadows, Path=IsChecked}" Value="True">
                    <!-- The setter below doesn't work: "The name 'lightsource' is not recognized" -->
                    <Setter TargetName="lightsource" Property="Content" Value="{StaticResource shaded_light}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Viewport3D.Style>
    <Viewport3D.Camera>
        <OrthographicCamera LookDirection="0,0,-1" Position="0,0,500" UpDirection="0,1,0" Width="400"/>
    </Viewport3D.Camera>
    <ModelVisual3D x:Name="lightsource">
        <ModelVisual3D.Content>
            <Model3DGroup Children="{StaticResource solid_light}" />
        </ModelVisual3D.Content>
    </ModelVisual3D>
    (...)
4

1 に答える 1

0

ViewPort3D(にはStyleプロパティがありますが、プロパティはありません)のいくつかの制限によりTemplate、異なる光源を切り替えるためにコード ビハインドに頼らなければなりませんでした。関連する部分を以下に掲載します (今回はポルトガル語の変数名を使用)。

(注:私はまだBindingを使用したXAMLのみのソリューションを好みますが、今のところ理解できません。誰かがXAMLのみの回答を投稿した場合は、喜んで受け入れます。)

ビューポート:

<Viewport3D x:Name="viewport">
    <Viewport3D.Resources>
        <Model3DGroup x:Key="luz_sombreada">
            <DirectionalLight  Color="White" Direction="-1,-1, -10" />
        </Model3DGroup>
        <Model3DGroup x:Key="luz_cheia">
            <AmbientLight  Color="White" />
        </Model3DGroup>
    </Viewport3D.Resources>
    <ModelVisual3D x:Name="luzes" Content="{StaticResource luz_cheia}" />

チェックボックス:

<CheckBox Content="Sombreado" Checked="sombreado_Changed" Unchecked="sombreado_Changed" />

コード ビハインドのイベント ハンドラー:

    private void sombreado_Changed(object sender, System.Windows.RoutedEventArgs e) {
        var nova_luz = new Model3DGroup();
        if (e.RoutedEvent.Name == "Checked") {
            nova_luz = (Model3DGroup)viewport.Resources["luz_sombreada"];
        }
        else if (e.RoutedEvent.Name == "Unchecked") {
            nova_luz = (Model3DGroup)viewport.Resources["luz_cheia"];
        }
        luzes.Content = nova_luz;
    }
于 2013-06-04T15:43:11.487 に答える