avaloniautils / dialoghost.avalonia Goto Github PK
View Code? Open in Web Editor NEWAvaloniaUI control that provides a simple way to display a dialog with information or prompt the user when information is needed
License: MIT License
AvaloniaUI control that provides a simple way to display a dialog with information or prompt the user when information is needed
License: MIT License
consider add shadow effect and custom corner radius.
The shadow effect makes the dialog appear taller than the owner content.
I've written a simple program with avalonia's mvvm template. Here's my MainWindowView.xaml
code:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:DialogHostTest.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:dialogHost="clr-namespace:DialogHost;assembly=DialogHost.Avalonia"
mc:Ignorable="d"
Width="300"
Height="200"
x:Class="DialogHostTest.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="DialogHostTest">
<Design.DataContext>
<vm:MainWindowViewModel/>
</Design.DataContext>
<dialogHost:DialogHost Identifier="{Binding DialogHostId}">
<Button VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Content="Show dialog" Command="{Binding ShowDialogAsync}"/>
</dialogHost:DialogHost>
</Window>
And here's MainViewModel
's code:
using System.Threading.Tasks;
namespace DialogHostTest.ViewModels
{
public class MainWindowViewModel : ViewModelBase
{
public static string DialogHostId => "MainDialogHost";
public async Task ShowDialogAsync()
{
var result = await MessageBoxViewModel.ShowAsync("Test message!", DialogHostId);
}
}
}
I want to show message box on this button's click, so I wrote a simple UserControl
and ViewModel
for it.
View's code:
<UserControl xmlns="https://github.com/avaloniaui"
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"
x:Class="DialogHostTest.Views.MessageBoxView">
<Grid RowDefinitions="*,10,*"
ColumnDefinitions="*,10,*">
<TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3"
Text="{Binding Message}"/>
<Button Grid.Row="2" Grid.Column="0"
Content="OK"
Command="{Binding OkButton}"/>
<Button Grid.Row="2" Grid.Column="2"
Content="Cancel"
Command="{Binding CancelButton}"/>
</Grid>
</UserControl>
ViewModel's code:
using System.Threading.Tasks;
using ReactiveUI;
using DialogHostTest.Enums;
namespace DialogHostTest.ViewModels
{
public class MessageBoxViewModel : ViewModelBase
{
private string _message;
public string Message
{
get => _message;
set => this.RaiseAndSetIfChanged(ref _message, value);
}
public DialogResult DialogResult { get; set; }
public MessageBoxViewModel(string message)
{
Message = message;
}
public void OkButton()
{
DialogResult = DialogResult.OK;
CloseDialog(MainWindowViewModel.DialogHostId);
}
public void CancelButton()
{
DialogResult = DialogResult.Cancel;
CloseDialog(MainWindowViewModel.DialogHostId);
}
public void CloseDialog(string dialogHostId)
{
DialogHost.DialogHost.Close(dialogHostId, DialogResult);
}
public static async Task<DialogResult> ShowAsync(string message, string dialogHostId)
{
var res = await DialogHost.DialogHost.Show(new MessageBoxViewModel(message), dialogHostId);
return (DialogResult)res;
}
}
}
But when I click on the button, I can't see the desired UserControl
:
That's how it looks in VS's designer:
Though I must say, that when I click on areas, where buttons should be, the dialog closes successfully, and I receive desired DialogResult
.
Avalonia has reached the 11.0 RC candidate: AvaloniaUI/Avalonia#11593
If I upgrade the project to use Avalonia 11.0.0-rc1.1
, I get these errors:
1>C:\dev\DialogHost.Avalonia\DialogHost.Avalonia\DialogOverlayPopupHost.axaml.cs(88,86,88,93): error CS0122: 'IManagedPopupPositionerPopup.Screens' is inaccessible due to its protection level
1>C:\dev\DialogHost.Avalonia\DialogHost.Avalonia\DialogOverlayPopupHost.axaml.cs(97,43,97,73): error CS0122: 'IManagedPopupPositionerPopup.ParentClientAreaScreenGeometry' is inaccessible due to its protection level
1>C:\dev\DialogHost.Avalonia\DialogHost.Avalonia\DialogOverlayPopupHost.axaml.cs(114,45,114,52): error CS0122: 'IManagedPopupPositionerPopup.Scaling' is inaccessible due to its protection level
1>C:\dev\DialogHost.Avalonia\DialogHost.Avalonia\DialogOverlayPopupHost.axaml.cs(101,43,101,56): error CS0122: 'IManagedPopupPositionerPopup.MoveAndResize(Point, Size)' is inaccessible due to its protection level
I'm using DialogHost.Avalonia 0.7.7 for an app project targeting both Android and iOS.
Avalonia framework version is 11.0.6 and .NET version is 7.
Please check the attached sample project. It simply opens a message dialog (MessageDialog.xaml) when clicking the Button.
Running in Debug mode, it works as expected on Android 11. Instead on iOS (different devices from version 15.8 to 16.2) the popup does not open, or it takes a very long time.
Sorry but I cannot test in Release mode as for now, so I cannot tell you if this is related to a particular Configuration.
I found a couple of issues:
If someone gives me some clues about how to fix it, I can try to create a PR.
Hi,
While testing with danipen/TextMateSharp#57 (comment) in the Avalonia 11.1 previews, I noticed that an about box using DialogHost.Avalonia didn't work correctly - the dialog appeared but didn't disappear when closed, just hung about over the top of the background.
As a test I tried updating the demo application from this repository to the Avalonia 11.1 Beta 1 release and saw there are problems there as well
There are also some warnings in the debugger output:
[Binding]An error occurred binding 'OverlayBackground' to '': 'Could not convert 'DialogHostDemo.ViewModels.MainWindowViewModel' (DialogHostDemo.ViewModels.MainWindowViewModel) to 'Avalonia.Media.IBrush'.' (DialogHost #25747420)
[Binding]An error occurred binding 'Background' to '': 'Could not convert 'DialogHostDemo.ViewModels.MainWindowViewModel' (DialogHostDemo.ViewModels.MainWindowViewModel) to 'Avalonia.Media.IBrush'.' (DialogHost #25747420)
Thanks.
Setting AlignmentDialogPopupPositioner.HorizontalAlignment
or VerticalAlignment
to Stretch
does not have an effect, the dialog gets aligned to the top left corner.
Sample code:
<dialogHostAvalonia:DialogHost CloseOnClickAway="True" IsOpen="True">
<dialogHostAvalonia:DialogHost.PopupPositioner>
<positioners:AlignmentDialogPopupPositioner VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</dialogHostAvalonia:DialogHost.PopupPositioner>
<dialogHostAvalonia:DialogHost.DialogContent>
<Border Background="Yellow" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<TextBlock>Dialog content</TextBlock>
</Border>
</dialogHostAvalonia:DialogHost.DialogContent>
Welcome to Avalonia!
</dialogHostAvalonia:DialogHost>
I have a commit that fixes this, but I am not sure if it is a valid solution or just a hack: 4f0a7fd
Hello, is there any plan to upgrade to avalonia11 preview5?
Running the demo in release mode results in a noticeable lag when opening a dialog with animations. It seems to get better after a few opens, probably because of some Avalonia caching.
Is this behavior expected/noticeable on other machines? I don't have the best PC in the world, but I would assume these animations should not be that compute intensive.
I may look into optimizing it in the future, but I'm not very proficient in Avalonia so if someone wants to pick it up go ahead. For now I will opt into dialog without zoom in animation, which mitigates the issue.
Actions:
Pretty sure this was working on previous versions of the nuget package. I moved to 0.7.7 and now i'm seeing a wrong popup when attempting to select the dialog content vs a data template.
When using a data template using the 'Show' method then later attempting to select IsOpen shows the previous DataTemplate instead of the DialogContent.
Here is the snippet of my XAML:
<dialogHostAvalonia:DialogHost
x:Name="DialogHost"
IsOpen="{Binding CommandError, Converter={x:Static ObjectConverters.IsNotNull}}"
Identifier="MainDialogHost"
DialogClosingCallback="{Binding DialogClosingHandler}"
DialogMargin="16"
dialogHostAvalonia:DialogHostStyle.CornerRadius="8">
dialogHostAvalonia:DialogHost.DataTemplates
</dialogHostAvalonia:DialogHost.DataTemplates>
<dialogHostAvalonia:DialogHost.DialogContent>
<StackPanel Orientation="Vertical">
....
When the binding trigger the IsOpen it will show a previous DataTenmplate used befaore. If no DataTemplate was used before then the behavior is to show the proper dialog content.
Can anybody confirm if this is a valid bug?
Thanks in advance,
I'm working with Avalonia 11.0.0-preview5
+ DialogHost 0.7.0-preview4
. My application style contains these declarations:
<Application.Styles>
<FluentTheme/>
<StyleInclude Source="avares://DialogHost.Avalonia/Styles.xaml"/>
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
It works fine, but once I upgrade Avalonia to the nightly build 11.0.999-cibuild0031207-beta
, the app crashes at startup with error:
System.TypeInitializationException
HResult=0x80131534
Message=The type initializer for 'DialogHostAvalonia.DialogOverlayPopupHost' threw an exception.
Source=DialogHost.Avalonia
StackTrace:
at CompiledAvaloniaXaml.!AvaloniaResources.Populate:/DialogOverlayPopupHost.axaml(IServiceProvider , Styles )
at CompiledAvaloniaXaml.!AvaloniaResources.Build:/DialogOverlayPopupHost.axaml(IServiceProvider )
at CompiledAvaloniaXaml.!AvaloniaResources.Populate:/Styles.xaml(IServiceProvider , Styles )
at CompiledAvaloniaXaml.!AvaloniaResources.Build:/Styles.xaml(IServiceProvider )
at GateTrainer.App.!XamlIlPopulate(IServiceProvider , App ) in C:\Users\miste\Projects\Spark\repo\GateTrainer\GateTrainer\GateTrainer\App.axaml:line 11
at GateTrainer.App.!XamlIlPopulateTrampoline(App )
at GateTrainer.App.Initialize() in C:\Users\miste\Projects\Spark\repo\GateTrainer\GateTrainer\GateTrainer\App.axaml.cs:line 14
at Avalonia.AppBuilder.Setup()
at Avalonia.AppBuilder.SetupWithLifetime(IApplicationLifetime lifetime)
at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, ShutdownMode shutdownMode)
at GateTrainer.Desktop.Program.Main(String[] args) in C:\Users\miste\Projects\Spark\repo\GateTrainer\GateTrainer\GateTrainer.Desktop\Program.cs:line 22
This exception was originally thrown at this call stack:
Inner Exception 1:
MissingMethodException: Method not found: 'Avalonia.StyledProperty`1<!!1> Avalonia.AvaloniaProperty.Register(System.String, !!1, Boolean, Avalonia.Data.BindingMode, System.Func`2<!!1,Boolean>, System.Func`3<Avalonia.AvaloniaObject,!!1,!!1>, System.Action`2<Avalonia.AvaloniaObject,Boolean>)'.
Background not changed with Material.Avalonia:
Fixed it by this code:
<Style Selector="dialogHost|DialogHost Border#PART_ContentBackground">
<Setter Property="Background" Value="{DynamicResource MaterialDesignPaper}"/>
</Style>
SystemControlBackgroundAltHighBrush => MaterialDesignPaper
Describe
If DialogHost control inside of a ViewBox control and if after running the app resize window along two axes(x,y), then popup will spawn in the wrong place (not in a center of the parent conrol). By default, without resizing popup spawns in center of the parent conrol.
Perhaps this behavior is correct?
Expected behavior
After resizing the window, popup will spawns in the center of a parent conrol.
If you override the OverlayLayer control (add HorizontalAlignment=Center, VerticalAlignment=Center, as showed below, then problem is solved:
Repro
https://github.com/SergeyV17/DialogHostViewBoxIssueRepro
Looks like the version 0.3.1 doesn't include the latest code, so that DisableOpeningAnimation property is not availiable.
Documentation files are not included in the NuGet package.
There's this property to set in the project.
<GenerateDocumentationFile>True</GenerateDocumentationFile>
I'm seeing a strange behavior using DialogHost.Avalonia 0.7.1
+ Avalonia 11.0.0-preview6
(cross platform solution).
Basically if one open a dialog, then closes it, then opens it again, then closes it, the dialog's content remains present in the main visual tree.
I've prepared a sample application to show it (please test the Desktop or Android project) DialogHostTest.zip
Also a video of the issue: https://we.tl/t-zLkYAVr5cH
I'm exploring to include support for DialogHost in MvvmDialogs. What I'm seeing is that you designed it to already support MVVM but in a different way.
Can it still be used purely from code-behind, to integrate into MvvmDialogs architecture?
What I'll want is to fill in this code.
public async Task<object?> ShowDialogHostAsync<T>(Control? owner)
where T : Control, new()
{
return await DialogHost.Show(new T());
}
How do I set the owner?
I could have a standard method to display any UserControl, then extensions methods calling it like MessageBox and InputText that display preset UserControls. If I pass the UserControl instance, then I can also set initial properties. Does that structure make sense?
Edit: I think I'm getting somewhere with this. Then I just need to create UserControls for the dialogs and it should work?
public async Task<object?> ShowDialogHostAsync<T>(Control? owner, T content, DialogClosingEventHandler? closingHandler = null)
where T : Control
{
var host = owner?.FindDescendantOfType<DialogHost>()!;
closingHandler ??= (_, _) => { };
return await DialogHost.Show(content, host, closingHandler);
}
I use DialogHost in my SukiUI library to show dialogs, and by the way thank you for you work 👍
Recently I made some Mobile Controls which requires to show a dialog at the bottom :
https://github.com/kikipoulet/SukiUI/wiki/3.-Mobile-Controls#mobile-picker
To make that I used some very ugly code in a very ugly fork to create a new parameter and simply show the dialog at bottom with this code change :
var verticalMargin = (parameters.AnchorRectangle.Height - parameters.Size.Height) / 1.05;
in the DialogPopupPositioner class.
The problem is that it messed up all my dependencies with avalonia 0.10 to 0.11 migration, and the only solution for me was to come at the DialogHost 0.6.0 nuget package, which basically saved me 👍
So .. could it be possible to add a "VerticalAlignment" parameter in the dialoghost control ? :-)
I put a datagrid in dialoghost, but it can be edit
<dialog:DialogHost DisableOpeningAnimation="True" Identifier="Main">
<dialog:DialogHost.DataTemplates>
<DataTemplate DataType="vm:AddAskModel">
....
<DataGrid
Width="200"
Height="150"
Margin="5,0,0,0"
AutoGenerateColumns="False"
CanUserResizeColumns="True"
CanUserSortColumns="False"
ItemsSource="{Binding ServerList}">
<DataGrid.Columns>
<DataGridTextColumn
Binding="{Binding Name}"
Header="执行的服务器"
IsReadOnly="False" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</dialog:DialogHost.DataTemplates>
....
To be precise, it is impossible to input text after selecting it
I have a minimal sample project where the DialogHost content contains a ListBox and a Button, when the ListBox is there the Dialog is not shown, if the ListBox is not there the Dialog is shown properly.
You can check with the project AvaloniaMatrixInvertIssue_v11 here:
https://github.com/Mrxx99/AvaloniaDialogHostAndAsyncImageLoaderIssue
Just lunch the project and click the "Show Dialog" button -> dialog will not show
then stop, remove or replace the ListBox and try again -> now it will work
(you can ignore the other projects and the async image loader in the repo as there was initial an issue when both were used together with avalonia 11 preview6)
I need to check some values at startup and after that I need to show or not show the view.
like this in View:
public MainViewModel()
{
Task.Run(Startup);
}
private bool _isLogged;
private async Task Startup()
{
if (_isLogged)
{
//don't show View
}
else
{
var loginView = new LoginViewControl();
await DialogHost.DialogHost.Show(loginView, "MainDialogHost");
}
}
For some reason, the View is not displayed at startup. Do you have any suggestions on how to do this?
在 System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
在 System.Collections.Generic.Dictionary2.KeyCollection.Enumerator.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()
在 System.Reactive.Disposables.CompositeDisposable.ToList(IEnumerable1 disposables) 在 System.Reactive.Disposables.CompositeDisposable..ctor(IEnumerable
1 disposables)
在 DialogHostAvalonia.Utilities.MultiDynamicResourceExtension.MultiDynamicResourceObservable..ctor(IEnumerable`1 observables, Object defaultValue)
在 DialogHostAvalonia.Utilities.MultiDynamicResourceExtension.Avalonia.Data.IBinding.Initiate(AvaloniaObject target, AvaloniaProperty targetProperty, Object anchor, Boolean enableDataValidation)
在 Avalonia.Styling.Setter.SetBinding(StyleInstance instance, AvaloniaObject target, IBinding binding)
在 Avalonia.Styling.Setter.Instance(IStyleInstance instance, StyledElement target)
在 Avalonia.Styling.StyleBase.Attach(StyledElement target, IStyleActivator activator, FrameType type)
在 Avalonia.Styling.ControlTheme.TryAttach(StyledElement target, FrameType type)
在 Avalonia.StyledElement.ApplyControlTheme(ControlTheme theme, FrameType type)
在 Avalonia.StyledElement.ApplyControlTheme()
在 Avalonia.StyledElement.ApplyStyling()
在 Avalonia.StyledElement.EndInit()
Hi.
I'm trying to use the DialogHost.Avalonia.
It'is working fine, opening the dialog centered on the screen.
How can I show the dialog at the bottom of the screen?
Thank you.
DialogHost can now be used via MvvmDialogs. I updated the documentation here
https://github.com/mysteryx93/HanumanInstitute.MvvmDialogs/#avaloniadialoghost
Perhaps you could update your documentation to mention the alternative usage?
The new package is not yet released; still remains this issue to solve first.
If you see DialogHost features or properties that should be added, let me know.
<!-- It's fine -->
<!--<dialogHostAvalonia:DialogHost.PopupPositioner>
<positioners:AlignmentDialogPopupPositioner VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="20"/>
</dialogHostAvalonia:DialogHost.PopupPositioner>-->
<dialogHostAvalonia:DialogHost.PopupPositioner>
<positioners:AlignmentDialogPopupPositioner VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20"/>
</dialogHostAvalonia:DialogHost.PopupPositioner>
The Margin property doesn't work when I try to align the upper left corner, so I forked the latest code and tried it out and found that everything works fine when aligning the small right corner, but not when aligning to the upper left corner. thanks
Updated from 0.7.0 preview-4 to 0.7.0 preview-5. Then I got a new error.
What is mean 'Invalid priority $Unset Arg_ParamName_Name' error?
Not get this error in preview-4.
Thanks
When I call DialogHost.Show
method this way to open dialogs one by one (this
is a ViewModel
of dialog to show):
public async Task<DialogResult> ShowAsync()
{
await DialogHost.DialogHost.Show(this, DialogHostId);
return (DialogResult)await DialogHost.DialogHost.Show(this, DialogHostId);
}
The second call shows dialog for a frame of a second, then it automatically closes, but the interface still looks like "blocked" and the only way to get rid of this is to rerun the program.
After digging inside of the second Show
calls, I've found out, that it throws an exception in DialogHost.cs
class after list.Count == 0
check on this method:
private static DialogHost.DialogHost GetInstance(string? dialogIdentifier)
{
if (DialogHost.DialogHost.LoadedInstances.Count == 0)
throw new InvalidOperationException("No loaded DialogHost instances.");
List<DialogHost.DialogHost> list = DialogHost.DialogHost.LoadedInstances.Where<DialogHost.DialogHost>((Func<DialogHost.DialogHost, bool>) (dh => dialogIdentifier == null || object.Equals((object) dh.Identifier, (object) dialogIdentifier))).ToList<DialogHost.DialogHost>();
if (list.Count == 0)
throw new InvalidOperationException("No loaded DialogHost have an Identifier property matching dialogIdentifier ('" + dialogIdentifier + "') argument.");
return list.Count <= 1 ? list[0] : throw new InvalidOperationException("Multiple viable DialogHosts. Specify a unique Identifier on each DialogHost, especially where multiple Windows are a concern.");
}
I should also mention, that if I manually set some delay between dialog's calls this way:
public async Task<DialogResult> ShowAsync()
{
await DialogHost.DialogHost.Show(this, DialogHostId);
await Task.Delay(1);
return (DialogResult)await DialogHost.DialogHost.Show(this, DialogHostId);
}
Then it works as expected.
Showing a Dialog with this; clicking away to close it, opening it a 2nd time, closing it again. On 3rd open, it throws an exception.
public async Task<object?> ShowDialogHostAsync(Control? owner, DialogHostSettings settings)
{
var host = owner?.FindDescendantOfType<DialogHostAvalonia.DialogHost>()!;
var closingHandler = settings.ClosingHandler ?? ((_, _) => { });
return await DialogHostAvalonia.DialogHost.Show(settings.ContentViewModel!, host, closingHandler);
}
System.InvalidOperationException: The control already has a visual parent.
at Avalonia.Visual.ValidateVisualChild(Visual c) in /_/src/Avalonia.Base/Visual.cs:line 646
at Avalonia.Visual.<>c.<.ctor>b__19_0(Visual visual) in /_/src/Avalonia.Base/Visual.cs:line 145
at Avalonia.Collections.AvaloniaList`1.InsertRange(Int32 index, IEnumerable`1 items) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 387
at Avalonia.Controls.Panel.ChildrenChanged(Object sender, NotifyCollectionChangedEventArgs e) in /_/src/Avalonia.Controls/Panel.cs:line 127
at Avalonia.Collections.AvaloniaList`1.NotifyAdd(T item, Int32 index) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 700
at Avalonia.Collections.AvaloniaList`1.Add(T item) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 205
at DialogHostAvalonia.DialogOverlayPopupHost.Show()
at DialogHostAvalonia.DialogOverlayPopupHost.set_IsOpen(Boolean value)
at DialogHostAvalonia.DialogHost.IsOpenPropertyChangedCallback(DialogHost dialogHost, Boolean newValue)
at DialogHostAvalonia.DialogHost.set_IsOpen(Boolean value)
at DialogHostAvalonia.DialogHost.ShowInternal(Object content, DialogOpenedEventHandler openedEventHandler, DialogClosingEventHandler closingEventHandler)
at HanumanInstitute.MvvmDialogs.Avalonia.DialogHost.DialogHostApi.ShowDialogHostAsync(Control owner, DialogHostSettings settings) in /home/hanuman/GitHub/HanumanInstitute.MvvmDialogs/src/MvvmDialogs.Avalonia.DialogHost/DialogHostApi.cs:line 11
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.