Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Hi,
I would like to report two issues I encountered while using Noesis GUI with Unity.
Issue 1: <Path> with IsHitTestVisible="False" blocks OnMouseDown events in Unity
Problem Description:
I have a world-space UI displayed above buildings. Some elements, like <Path>, are used for design purposes and are set to IsHitTestVisible="False".
I expect that when IsHitTestVisible="False" is set, events should be passed through to the 3D elements (buildings) underneath the UI. However, this is not the case. Despite the element being set as non-interactive, it still blocks the OnMouseDown event in Unity.
I used VisualTreeHelper.HitTest to verify if the UI elements were consuming the click events, and it shows that the <Path> element consumes the clicks even though IsHitTestVisible="False" is set.
Test Code:
Expected Behavior:
I expect that when IsHitTestVisible="False" is set on a <Path> element, all click events are passed through to the underlying 3D elements (like buildings).
Issue 2: Image Binding Issue
Problem Description:
When using an <Image> element with a static image source, the image displays correctly. For example, the following code works as expected:
However, when I try to bind the image source using an Icon property (Binding), the image does not display, even though the bound value for Icon is exactly the same as the static path. Here is the code that does not work:
The image is not found when using the binding, despite the value being correct..
Interestingly, if I place both the static image and the bound image together in the XAML, both images display correctly. This suggests that the binding itself is valid, but there might be an issue with loading the image solely through binding.
Expected Behavior:
I expect that binding the image source using {Binding Icon} should load and display the image independently, just like when providing a static path.
thank you .
I would like to report two issues I encountered while using Noesis GUI with Unity.
Issue 1: <Path> with IsHitTestVisible="False" blocks OnMouseDown events in Unity
Problem Description:
I have a world-space UI displayed above buildings. Some elements, like <Path>, are used for design purposes and are set to IsHitTestVisible="False".
I expect that when IsHitTestVisible="False" is set, events should be passed through to the 3D elements (buildings) underneath the UI. However, this is not the case. Despite the element being set as non-interactive, it still blocks the OnMouseDown event in Unity.
I used VisualTreeHelper.HitTest to verify if the UI elements were consuming the click events, and it shows that the <Path> element consumes the clicks even though IsHitTestVisible="False" is set.
Test Code:
Code: Select all
<Path Stroke="#90000009" StrokeThickness="30" Fill="Transparent" IsHitTestVisible="False" Data="{Binding BackgroundGeometry}" />
Code: Select all
VisualTreeHelper.HitTest Output:
[World-Space UI] Mouse is over a UI element: Noesis.Path
Physics.Raycast Output
[Unity Raycast] Building clicked!
OnMouseDown() not called
I expect that when IsHitTestVisible="False" is set on a <Path> element, all click events are passed through to the underlying 3D elements (like buildings).
Issue 2: Image Binding Issue
Problem Description:
When using an <Image> element with a static image source, the image displays correctly. For example, the following code works as expected:
Code: Select all
<Image Source="/Assets/View/GamePlay/build-all.png"
Width="20" Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="0.7"/>
Code: Select all
<Image Source="{Binding Icon}"
Width="20" Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="0.7"/>
Code: Select all
[NOESIS] Image not found '/Assets/View/GamePlay/build-all.png'
Interestingly, if I place both the static image and the bound image together in the XAML, both images display correctly. This suggests that the binding itself is valid, but there might be an issue with loading the image solely through binding.
Code: Select all
<Image Source="/Assets/View/GamePlay/build-all.png"
Width="20" Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="0.7"/>
<Image Source="{Binding Icon}"
Width="20" Height="20"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Opacity="0.7"/>
I expect that binding the image source using {Binding Icon} should load and display the image independently, just like when providing a static path.
thank you .
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Hi,
I would like to add a quick clarification regarding the issue I previously reported about <Path> with IsHitTestVisible="False". I have noticed that the same behavior also occurs with the <Border> element. Even when IsHitTestVisible="False" is set on a <Border>, it still blocks click events (like OnMouseDown) from reaching the 3D elements beneath the UI.
I believe this is a general issue with how Noesis handles non-interactive elements (IsHitTestVisible="False").
Thank you.
I would like to add a quick clarification regarding the issue I previously reported about <Path> with IsHitTestVisible="False". I have noticed that the same behavior also occurs with the <Border> element. Even when IsHitTestVisible="False" is set on a <Border>, it still blocks click events (like OnMouseDown) from reaching the 3D elements beneath the UI.
I believe this is a general issue with how Noesis handles non-interactive elements (IsHitTestVisible="False").
Thank you.
-
sfernandez
Site Admin
- Posts: 3138
- Joined:
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Hi,
1. IsHitTestVisible has a bit weird behavior in WPF, because normal calls to VisualTreeHelper.HitTest() will return objects with that property set to False, and Noesis is following that approach too. An alternative is to use the HitTest() method with callbacks, and filter the elements that have IsHitTestVisible set to False, like I explained here: https://www.noesisengine.com/bugs/view. ... 3476#c9787, but we need to think if we want to do that by default in Unity to consume input events.
2. This is happening because when you use only a Binding to the image, the corresponding Texture asset is not referenced by any element of the scene. You can add explicit dependencies in any xaml by using this:
1. IsHitTestVisible has a bit weird behavior in WPF, because normal calls to VisualTreeHelper.HitTest() will return objects with that property set to False, and Noesis is following that approach too. An alternative is to use the HitTest() method with callbacks, and filter the elements that have IsHitTestVisible set to False, like I explained here: https://www.noesisengine.com/bugs/view. ... 3476#c9787, but we need to think if we want to do that by default in Unity to consume input events.
2. This is happening because when you use only a Binding to the image, the corresponding Texture asset is not referenced by any element of the scene. You can add explicit dependencies in any xaml by using this:
Code: Select all
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:noesis="clr-namespace:NoesisGUIExtensions;assembly=Noesis.GUI.Extensions">
<noesis:Xaml.Dependencies>
<noesis:Dependency Source="Language-en.xaml"/>
<noesis:Dependency Source="Language-fr.xaml"/>
<noesis:Dependency Source="Language-jp.xaml"/>
</noesis:Xaml.Dependencies>
</UserControl>
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Thanks for help .Hi,
1. IsHitTestVisible has a bit weird behavior in WPF, because normal calls to VisualTreeHelper.HitTest() will return objects with that property set to False, and Noesis is following that approach too. An alternative is to use the HitTest() method with callbacks, and filter the elements that have IsHitTestVisible set to False, like I explained here: https://www.noesisengine.com/bugs/view. ... 3476#c9787, but we need to think if we want to do that by default in Unity to consume input events.
2. This is happening because when you use only a Binding to the image, the corresponding Texture asset is not referenced by any element of the scene. You can add explicit dependencies in any xaml by using this:Code: Select all<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:noesis="clr-namespace:NoesisGUIExtensions;assembly=Noesis.GUI.Extensions"> <noesis:Xaml.Dependencies> <noesis:Dependency Source="Language-en.xaml"/> <noesis:Dependency Source="Language-fr.xaml"/> <noesis:Dependency Source="Language-jp.xaml"/> </noesis:Xaml.Dependencies> </UserControl>
1 - The proposed code seems to solve the first problem
https://www.noesisengine.com/bugs/view. ... 3476#c9787
Will this code be included in any future updates or do I have to do this myself in every update?
2 - I still don't understand how to do it in my case
Suppose I get data from a web server when I start the game
The web server returns the paths according to what is involved in the game.
What is the best way to deal with this?
Thank you .
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Please, file a ticket about this and we will think about it.1 - The proposed code seems to solve the first problem
https://www.noesisengine.com/bugs/view. ... 3476#c9787
Will this code be included in any future updates or do I have to do this myself in every update?
For the scenario you were describing in your first post, you need to maintain a hard-reference to the texture somewhere. This is a requirement of the Unity asset system, we offer an extension to inject manual dependencies to XAML as Sergio described, but you can use any Unity native way (for example, have the reference in a ScriptableObject).2 - I still don't understand how to do it in my case
Suppose I get data from a web server when I start the game
Downloading data from a web server is a different problem and depending on what you need, you probably want to use AssetBundles for that.
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
For the scenario you were describing in your first post, you need to maintain a hard-reference to the texture somewhere. This is a requirement of the Unity asset system, we offer an extension to inject manual dependencies to XAML as Sergio described, but you can use any Unity native way (for example, have the reference in a ScriptableObject).
Downloading data from a web server is a different problem and depending on what you need, you probably want to use AssetBundles for that.
Thanks for the reply
I did not mean to download the image from the server.
The images are already in the game. The server just sends the path
As I explained {Binding Icon}
The Icon value here is string of the image path in the game like "/Assets/View/GamePlay/build-all.png"
Let's assume that I have a list of images that I would like to use when needed as Binding with image path value .
like this
Code: Select all
public class MyViewModel : INotifyPropertyChanged
{
private string _icon;
public string Icon
{
get { return _icon; }
set
{
_icon = value;
OnPropertyChanged(nameof(Icon));
}
}
public MyViewModel()
{
Icon = "/Assets/View/GamePlay/build-all.png";
}
...
}
<Image Source="{Binding Icon}" />
Can you explain an example of doing this?
Thank you
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
If these images are not directly referenced in any XAML (as appears to be the case here), you'll need to manually inject their dependencies (as described above) for each one.Let's assume that I have a list of images that I would like to use when needed as Binding with image path value .
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
I didn't get itIf these images are not directly referenced in any XAML (as appears to be the case here), you'll need to manually inject their dependencies (as described above) for each one.Let's assume that I have a list of images that I would like to use when needed as Binding with image path value .
The example you are referring to is about translation
i doesn't know how I can make "/Assets/View/GamePlay/build-all.png" usable by Binding
Can you explain via code?
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Add this line to the root of your XAML:
And your binding will start to work.
Code: Select all
<noesis:Xaml.Dependencies>
<noesis:Dependency Source="/Assets/View/GamePlay/build-all.png"/>
</noesis:Xaml.Dependencies>
Re: Two Issues with Noesis GUI - Blocking OnMouseDown Events and Image Binding
Add this line to the root of your XAML:
And your binding will start to work.Code: Select all<noesis:Xaml.Dependencies> <noesis:Dependency Source="/Assets/View/GamePlay/build-all.png"/> </noesis:Xaml.Dependencies>
Thank you 🙏
I thought <noesis:Dependency> only dealt with xaml . This makes it very easy
Thank you. 🙏🙏🙏
Who is online
Users browsing this forum: Bing [Bot] and 5 guests