Test Stefan
This commit is contained in:
parent
806238b714
commit
377e47c785
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@ -0,0 +1,178 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\wwwroot\\css\\site.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\wwwroot\\css\\site.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\pages\\layout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\pages\\layout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\pages\\todoliste.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\pages\\todoliste.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\shared\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\shared\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\shared\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\shared\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\dxblazorapplication1.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\dxblazorapplication1.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "Layout.razor.css",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Pages\\Layout.razor.css",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Pages\\Layout.razor.css",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Pages\\Layout.razor.css",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Pages\\Layout.razor.css",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-08-17T17:44:08.685Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "site.css",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\wwwroot\\css\\site.css*",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\wwwroot\\css\\site.css*",
|
||||
"ViewState": "AgIAACoAAAAAAAAAAAAAACsAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-08-17T17:42:31.081Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "ToDoListe.razor.css",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Pages\\ToDoListe.razor.css",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Pages\\ToDoListe.razor.css",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Pages\\ToDoListe.razor.css*",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Pages\\ToDoListe.razor.css*",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-08-17T17:41:51.247Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 4,
|
||||
"Title": "NavMenu.razor",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAEAAAAUAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-08-17T17:35:06.626Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 3,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Program.cs",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Program.cs",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Program.cs",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAACAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-08-17T17:31:21.741Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 6,
|
||||
"Title": "DxBlazorApplication1",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
|
||||
"WhenOpened": "2025-08-17T17:19:23.438Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 5,
|
||||
"Title": "MainLayout.razor",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"ViewState": "AgIAACEAAAAAAAAAAAAAACEAAAA8AAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-08-17T17:14:40.87Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,140 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\wwwroot\\css\\site.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\wwwroot\\css\\site.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\shared\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\shared\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\shared\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\shared\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|d:\\entwicklung\\blazor\\dxblazorapplication1\\dxblazorapplication1\\dxblazorapplication1.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
|
||||
"RelativeMoniker": "D:0:0:{BD019368-677D-4AC7-AB8B-F535A62DB154}|DxBlazorApplication1\\DxBlazorApplication1.csproj|solutionrelative:dxblazorapplication1\\dxblazorapplication1.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 10,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:133:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:134:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:136:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:135:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Bookmark",
|
||||
"Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "site.css",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\wwwroot\\css\\site.css",
|
||||
"ViewState": "AgIAACoAAAAAAAAAAAAAACsAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||
"WhenOpened": "2025-08-17T17:42:31.081Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "NavMenu.razor",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Shared\\NavMenu.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAEAAAAUAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-08-17T17:35:06.626Z"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Program.cs",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Program.cs",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Program.cs",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAACAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-08-17T17:31:21.741Z"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 4,
|
||||
"Title": "DxBlazorApplication1",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\DxBlazorApplication1.csproj",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
|
||||
"WhenOpened": "2025-08-17T17:19:23.438Z"
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 3,
|
||||
"Title": "MainLayout.razor",
|
||||
"DocumentMoniker": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"RelativeDocumentMoniker": "DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"ToolTip": "D:\\Entwicklung\\Blazor\\DxBlazorApplication1\\DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"RelativeToolTip": "DxBlazorApplication1\\Shared\\MainLayout.razor",
|
||||
"ViewState": "AgIAACEAAAAAAAAAAAAAACEAAAA8AAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-08-17T17:14:40.87Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
25
Test Stefan/DxBlazorApplication1/DxBlazorApplication1.sln
Normal file
25
Test Stefan/DxBlazorApplication1/DxBlazorApplication1.sln
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.14.36408.4
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DxBlazorApplication1", "DxBlazorApplication1\DxBlazorApplication1.csproj", "{BD019368-677D-4AC7-AB8B-F535A62DB154}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{BD019368-677D-4AC7-AB8B-F535A62DB154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BD019368-677D-4AC7-AB8B-F535A62DB154}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BD019368-677D-4AC7-AB8B-F535A62DB154}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BD019368-677D-4AC7-AB8B-F535A62DB154}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {68A8D485-6884-406A-8A76-A9555C165453}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@ -0,0 +1,11 @@
|
||||
|
||||
<Router AppAssembly="@typeof(Program).Assembly">
|
||||
<Found Context="routeData">
|
||||
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
|
||||
</Found>
|
||||
<NotFound>
|
||||
<LayoutView Layout="@typeof(MainLayout)">
|
||||
<p>Sorry, there's nothing at this address.</p>
|
||||
</LayoutView>
|
||||
</NotFound>
|
||||
</Router>
|
||||
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace DxBlazorApplication1.Data.Annotations
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
|
||||
public class DateInPastAttribute : ValidationAttribute
|
||||
{
|
||||
public int YearsAgo { get; set; } = 0;
|
||||
|
||||
public override bool IsValid(object value)
|
||||
{
|
||||
return (DateTime)value <= DateTime.Now.AddYears(-YearsAgo);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace DxBlazorApplication1.Data.Annotations
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = true)]
|
||||
public class DateIsEarlierThanAttribute : ValidationAttribute
|
||||
{
|
||||
readonly string datePropertyToCompare;
|
||||
public DateIsEarlierThanAttribute(string datePropertyToCompare)
|
||||
{
|
||||
this.datePropertyToCompare = datePropertyToCompare;
|
||||
}
|
||||
|
||||
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
|
||||
{
|
||||
var property = validationContext.ObjectType.GetProperty(datePropertyToCompare);
|
||||
if (property == null)
|
||||
{
|
||||
return new ValidationResult(
|
||||
$"Unknown property: {datePropertyToCompare}",
|
||||
new[] { validationContext.MemberName });
|
||||
}
|
||||
|
||||
if ((DateTime)value > (DateTime)property.GetValue(validationContext.ObjectInstance))
|
||||
{
|
||||
return new ValidationResult(
|
||||
ErrorMessage ?? $"The {validationContext.MemberName} value cannot be greater than the {datePropertyToCompare} value",
|
||||
new[] { validationContext.MemberName, datePropertyToCompare });
|
||||
}
|
||||
return ValidationResult.Success;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace DxBlazorApplication1.Data.Annotations
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
|
||||
public class EmailAttribute : ValidationAttribute
|
||||
{
|
||||
public override bool IsValid(object value)
|
||||
{
|
||||
return Regex.IsMatch((string)value, @"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
|
||||
+ "@"
|
||||
+ @"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace DxBlazorApplication1.Data.Annotations
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
|
||||
public class MinPasswordLengthAttribute : ValidationAttribute
|
||||
{
|
||||
int MinLength { get; }
|
||||
public MinPasswordLengthAttribute(int minLength, string errorMsg) : base(errorMsg)
|
||||
{
|
||||
MinLength = minLength;
|
||||
}
|
||||
|
||||
public override bool IsValid(object value)
|
||||
{
|
||||
return ((string)value).Length >= MinLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
namespace DxBlazorApplication1
|
||||
{
|
||||
public class TodoItem
|
||||
{
|
||||
public TodoItem(string text)
|
||||
{
|
||||
Text = text;
|
||||
}
|
||||
|
||||
public string Text { get; set; }
|
||||
|
||||
public bool Completed { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using DxBlazorApplication1.Data.Annotations;
|
||||
|
||||
namespace DxBlazorApplication1
|
||||
{
|
||||
public class UserDataBase
|
||||
{
|
||||
[Required(ErrorMessage = "The Username value should be specified.")]
|
||||
public string Username { get; set; }
|
||||
[Required(ErrorMessage = "The Password value should be specified.")]
|
||||
[MinPasswordLength(6, "The Password must be at least 6 characters long.")]
|
||||
public string Password { get; set; }
|
||||
}
|
||||
public class UserData : UserDataBase
|
||||
{
|
||||
public static DateTime BirthDateNullValue { get; set; } = new DateTime(1970, 1, 1);
|
||||
[Required(ErrorMessage = "The Email value should be specified.")]
|
||||
[Email(ErrorMessage = "The Email value is invalid.")]
|
||||
public string Email { get; set; }
|
||||
[Required(ErrorMessage = "The Phone value should be specified.")]
|
||||
public string Phone { get; set; }
|
||||
[DateInPast(YearsAgo = 18, ErrorMessage = "Users should be at least 18 years old to register.")]
|
||||
public DateTime BirthDate { get; set; } = BirthDateNullValue;
|
||||
public string Occupation { get; set; }
|
||||
public string Notes { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,13 @@
|
||||
namespace DxBlazorApplication1.Data
|
||||
{
|
||||
public class WeatherForecast
|
||||
{
|
||||
public DateTime Date { get; set; }
|
||||
|
||||
public int TemperatureC { get; set; }
|
||||
|
||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||
|
||||
public string? Summary { get; set; }
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
namespace DxBlazorApplication1.Data
|
||||
{
|
||||
public class WeatherForecastService
|
||||
{
|
||||
private static readonly string[] Summaries = new[]
|
||||
{
|
||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||
};
|
||||
|
||||
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
|
||||
{
|
||||
var rng = new Random();
|
||||
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||
{
|
||||
Date = startDate.AddDays(index),
|
||||
TemperatureC = rng.Next(-20, 55),
|
||||
Summary = Summaries[rng.Next(Summaries.Length)]
|
||||
}).ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DevExpress.Blazor" Version="25.1.4" />
|
||||
<PackageReference Include="DevExpress.Blazor.PdfViewer" Version="25.1.4" />
|
||||
<PackageReference Include="DevExpress.Pdf.SkiaRenderer" Version="25.1.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="wwwroot\images\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<NameOfLastUsedPublishProfile>D:\Entwicklung\Blazor\DxBlazorApplication1\DxBlazorApplication1\Properties\PublishProfiles\IISProfile1.pubxml</NameOfLastUsedPublishProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,12 @@
|
||||
The following open source libraries are used and included within thеse sample/demonstration projects:
|
||||
|
||||
Bootstrap (Open Source – MIT License)
|
||||
Copyright (c) 2011-2021 Twitter, Inc. / Copyright (c) 2011-2021 The Bootstrap Authors
|
||||
https://github.com/twbs/bootstrap/blob/main/LICENSE
|
||||
|
||||
open-iconic (Open Source – MIT License and SIL Open Font License)
|
||||
Copyright (c) 2014 Waybury
|
||||
https://github.com/iconic/open-iconic/blob/master/ICON-LICENSE
|
||||
https://github.com/iconic/open-iconic/blob/master/FONT-LICENSE
|
||||
|
||||
The open source libraries included in these sample/demonstration projects are done so pursuant to each individual open source library license and subject to the disclaimers and limitations on liability set forth in each open source library license.
|
||||
@ -0,0 +1,41 @@
|
||||
@page
|
||||
@model DxBlazorApplication1.Pages.ErrorModel
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<title>Error</title>
|
||||
<link href="_content/DevExpress.Blazor.Themes/blazing-berry.bs5.css" rel="stylesheet" />
|
||||
|
||||
<link href="~/css/site.css" rel="stylesheet" asp-append-version="true"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="px-4">
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (Model.ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace DxBlazorApplication1.Pages {
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
[IgnoreAntiforgeryToken]
|
||||
public class ErrorModel : PageModel {
|
||||
public string? RequestId { get; set; }
|
||||
|
||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
|
||||
private readonly ILogger<ErrorModel> _logger;
|
||||
|
||||
public ErrorModel(ILogger<ErrorModel> logger) {
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void OnGet() {
|
||||
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
@page "/grid"
|
||||
|
||||
@using DxBlazorApplication1.Data
|
||||
@inject WeatherForecastService ForecastService
|
||||
|
||||
<h2>DevExpress Grid</h2>
|
||||
|
||||
<p class="pb-2 pt-2 mw-1100">The DevExpress Grid for Blazor allows you to display and manage data via a tabular (rows/columns) UI metaphor.
|
||||
This page uses our Blazor Grid component to display weather forecast values.</p>
|
||||
|
||||
@if (forecasts == null)
|
||||
{
|
||||
<p><em>Loading...</em></p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<DxGrid Data="@forecasts"
|
||||
CssClass="mw-1100">
|
||||
<Columns>
|
||||
<DxGridDataColumn Caption="Date" FieldName="Date" />
|
||||
<DxGridDataColumn Caption="Temperature" FieldName="TemperatureF" />
|
||||
</Columns>
|
||||
</DxGrid>
|
||||
}
|
||||
|
||||
@code {
|
||||
private WeatherForecast[]? forecasts;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
@page "/"
|
||||
|
||||
<h2 class="pb-2">Blazor Components</h2>
|
||||
<p class="pb-2 mw-1100">
|
||||
Our Blazor UI components will help you create intuitive and highly-refined user experiences for both Blazor Server (ASP.NET Core) and Blazor WebAssembly hosting models.
|
||||
</p>
|
||||
<div class="pb-2 mw-1100">
|
||||
<img class="fit-width" src="images/banner.png" />
|
||||
</div>
|
||||
|
||||
<h2 class="mb-4 mt-4">Helpful Resources</h2>
|
||||
|
||||
<ul>
|
||||
<li><a class="helplink" href="https://demos.devexpress.com/blazor/" target="_blank">Online Demos</a></li>
|
||||
<li><a class="helplink" href="https://github.com/DevExpress/Blazor/blob/master/examples.md" target="_blank">Examples</a></li>
|
||||
<li><a class="helplink" href="https://docs.devexpress.com/Blazor/400725/blazor-components" target="_blank">Documentation</a></li>
|
||||
<li><a class="helplink" href="https://www.devexpress.com/support/training/blazor/" target="_blank">Free Blazor Training Course</a></li>
|
||||
</ul>
|
||||
@ -0,0 +1,98 @@
|
||||
@page "/layout"
|
||||
@using System.IO
|
||||
@inject IJSRuntime JS
|
||||
|
||||
<script>
|
||||
window.downloadFileFromStream = async (fileName, contentStreamReference) => {
|
||||
const arrayBuffer = await contentStreamReference.arrayBuffer();
|
||||
const blob = new Blob([arrayBuffer]);
|
||||
const url = URL.createObjectURL(blob);
|
||||
const anchorElement = document.createElement('a');
|
||||
anchorElement.href = url;
|
||||
anchorElement.download = fileName ?? '';
|
||||
anchorElement.click();
|
||||
anchorElement.remove();
|
||||
URL.revokeObjectURL(url);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="border" style="padding: 20px; margin-top: 20px;">
|
||||
|
||||
<DxFormLayout CssClass="w-100 demo-form-layout">
|
||||
<DxFormLayoutItem Caption="Contact Name:">
|
||||
<DxTextBox @bind-Text="@Name" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem Caption="eMail:">
|
||||
<DxTextBox @bind-Text="@Email" InputId="contactEmail" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem Caption="Birth Date:">
|
||||
<DxDateEdit @bind-Date="@BirthDate" Mask="@DateTimeMask.ShortDate" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem Caption="Years Worked:">
|
||||
<DxSpinEdit @bind-Value="@YearsWorked" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem Caption="On Vacation:">
|
||||
<DxCheckBox @bind-Checked="@OnVacation" />
|
||||
</DxFormLayoutItem>
|
||||
</DxFormLayout>
|
||||
|
||||
<div class="w-100 mx-0 mt-3">
|
||||
<p class="demo-text col-12 mt-2">
|
||||
@nameof(Name)=<b>@Name</b>,
|
||||
@nameof(Email)=<b>@Email</b>,
|
||||
@nameof(BirthDate)=<b>@BirthDate</b>,
|
||||
@nameof(YearsWorked)=<b>@YearsWorked</b>,
|
||||
@nameof(OnVacation)=<b>@OnVacation</b>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border" style="padding: 20px; margin-top: 20px;">
|
||||
|
||||
<DxFormLayout>
|
||||
@* If the viewport width is less then 768px (medium), the item occupies 12 columns *@
|
||||
@* If the viewport width is from 768px (medium) to 1200px (extra large), the item occupies 6 columns *@
|
||||
@* If the viewport width exceeds 1200px (extra large), the item occupies 4 columns *@
|
||||
<DxFormLayoutItem Caption="Name" ColSpanXl="4" ColSpanMd="6">
|
||||
<DxTextBox />
|
||||
</DxFormLayoutItem>
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
|
||||
<div class="border" style="padding: 20px; margin-top: 20px;">
|
||||
<div>
|
||||
<button @onclick="DownloadFileFromStream">
|
||||
Download File From Stream
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
string Name { get; set; } = "Nancy Davolio";
|
||||
string Email { get; set; } = "NancyDavolio@sample.com";
|
||||
DateTime BirthDate { get; set; } = DateTime.Now.AddYears(-20);
|
||||
int YearsWorked { get; set; } = 3;
|
||||
bool OnVacation { get; set; } = true;
|
||||
bool IsInfoOpen { get; set; } = false;
|
||||
|
||||
/* private Stream GetFileStream()
|
||||
{
|
||||
var randomBinaryData = new byte[50 * 1024];
|
||||
var fileStream = new MemoryStream(randomBinaryData);
|
||||
|
||||
return fileStream;
|
||||
}
|
||||
*/
|
||||
private Stream GetFileStream() => File.OpenRead(@"D:\Mappe1.xlsx");
|
||||
|
||||
private async Task DownloadFileFromStream()
|
||||
{
|
||||
var fileStream = GetFileStream();
|
||||
var fileName = "Mappe2.xlsx";
|
||||
|
||||
using var streamRef = new DotNetStreamReference(stream: fileStream);
|
||||
|
||||
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
@page "/login"
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
<div class="card cw-480" style="width: 400px">
|
||||
<EditForm Model="@Data"
|
||||
OnValidSubmit="@HandleValidSubmit"
|
||||
OnInvalidSubmit="@HandleInvalidSubmit"
|
||||
Context="EditFormContext">
|
||||
<DataAnnotationsValidator />
|
||||
<div class="card-header text-center py-3">
|
||||
<h4>Welcome to DevExpress</h4>
|
||||
<p class="tm-8 mb-0 fw-normal fs-825">
|
||||
Log in to see it in action
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<DxFormLayout>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="tbUsername" class="d-none">Username</label>
|
||||
<DxTextBox @bind-Text="@Data.Username"
|
||||
NullText="Username"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="tbUsername" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Username)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="tbPassword" class="d-none">Password</label>
|
||||
<DxTextBox @bind-Text="@Data.Password"
|
||||
NullText="Password"
|
||||
Password="true"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="tbPassword" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Password)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<DxButton CssClass="w-100"
|
||||
Text="Login"
|
||||
RenderStyle="ButtonRenderStyle.Primary"
|
||||
SubmitFormOnClick="true" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<div class="text-center pt-2">
|
||||
<div class="tm-8 fs-825">
|
||||
Do not have an account?
|
||||
</div>
|
||||
<DxButton Text="Create an account"
|
||||
RenderStyle="ButtonRenderStyle.Link"
|
||||
Click="GotoRegistrationForm" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
</EditForm>
|
||||
</div>
|
||||
<p class="tm-8 cw-480 mt-2">
|
||||
@FormSubmitResult
|
||||
</p>
|
||||
|
||||
@code {
|
||||
string FormSubmitResult = "";
|
||||
UserDataBase Data { get; set; } = new UserDataBase();
|
||||
void GotoRegistrationForm()
|
||||
{
|
||||
Navigation.NavigateTo("/Register");
|
||||
|
||||
}
|
||||
void HandleValidSubmit()
|
||||
{
|
||||
FormSubmitResult = "You have been logged in successully.";
|
||||
}
|
||||
void HandleInvalidSubmit()
|
||||
{
|
||||
FormSubmitResult = "";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
@page "/pdfviewer"
|
||||
@using DevExpress.Blazor.PdfViewer
|
||||
@using System.Reflection
|
||||
|
||||
<head>
|
||||
<link rel="stylesheet" href=@AppendVersion("_content/DevExpress.Blazor.Viewer/css/dx-blazor-viewer-components.bs5.css")>
|
||||
</head>
|
||||
|
||||
<div style="display: flex">
|
||||
|
||||
<div id="overviewDemoDropZone" class="card custom-drop-zone rounded-3 w-100 m-0">
|
||||
<span class="drop-file-icon mb-3"></span>
|
||||
<span class="drop-file-label">Drag and Drop File Here</span><span class="m-1">or</span>
|
||||
<DxButton Id="overviewDemoSelectButton"
|
||||
CssClass="m-1"
|
||||
RenderStyle="ButtonRenderStyle.Primary"
|
||||
Text="Select File" />
|
||||
</div>
|
||||
<DxFileInput @ref="fileInput"
|
||||
AcceptedFileTypes="@ALLOWED_FILE_TYPES"
|
||||
AllowedFileExtensions="@ALLOWED_FILE_TYPES"
|
||||
CssClass="w-100"
|
||||
ExternalDropZoneCssSelector="#overviewDemoDropZone"
|
||||
ExternalDropZoneDragOverCssClass="custom-drop-zone-hover"
|
||||
ExternalSelectButtonCssSelector="#overviewDemoSelectButton"
|
||||
FilesUploading="OnFilesUploading"
|
||||
MaxFileSize="2000000">
|
||||
</DxFileInput>
|
||||
<div style="width: 4000px">
|
||||
<DxPdfViewer CssClass="w-100 pdf-viewer" DocumentContent="DocumentContent" ZoomLevel=1/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
readonly List<string> ALLOWED_FILE_TYPES = new List<string> { ".pdf" };
|
||||
DxFileInput fileInput;
|
||||
byte[] DocumentContent { get; set; }
|
||||
|
||||
private Stream GetFileStream() => File.OpenRead(@"D:\E-RechnungA3.pdf");
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||
using (Stream stream = GetFileStream())
|
||||
using (var binaryReader = new BinaryReader(stream))
|
||||
DocumentContent = binaryReader.ReadBytes((int)stream.Length);
|
||||
}
|
||||
|
||||
protected async Task OnFilesUploading(FilesUploadingEventArgs args)
|
||||
{
|
||||
using (MemoryStream stream = new MemoryStream())
|
||||
{
|
||||
IFileInputSelectedFile file = args.Files[0];
|
||||
await file.OpenReadStream(file.Size).CopyToAsync(stream);
|
||||
DocumentContent = stream.ToArray();
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
|
||||
private string AppendVersion(string path) => $"{path}?v={typeof(DevExpress.Blazor.ResourcesConfigurator).Assembly.GetName().Version}";
|
||||
}
|
||||
@ -0,0 +1,158 @@
|
||||
@page "/register"
|
||||
@using DxBlazorApplication1.Data.Annotations
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
<div class="card cw-480" style="width: 400px">
|
||||
<EditForm Model="@Data"
|
||||
OnValidSubmit="@HandleValidSubmit"
|
||||
OnInvalidSubmit="@HandleInvalidSubmit"
|
||||
Context="EditFormContext">
|
||||
<DataAnnotationsValidator />
|
||||
<div class="card-header text-center py-3">
|
||||
<h4>Register to DevExpress</h4>
|
||||
<p class="tm-8 mb-0 fw-normal fs-825">
|
||||
Create a new account to see it in action
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<DxFormLayout>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="tbUsername" class="d-none">Username</label>
|
||||
<DxTextBox @bind-Text="@Data.Username"
|
||||
NullText="Username"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="tbUsername" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Username)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="tbPassword" class="d-none">Password</label>
|
||||
<DxTextBox @bind-Text="@Data.Password"
|
||||
NullText="Password"
|
||||
Password="true"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="tbPassword" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Password)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="tbEmail" class="d-none">E-mail</label>
|
||||
<DxTextBox @bind-Text="@Data.Email"
|
||||
NullText="E-mail"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="tbEmail" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Email)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="miPhone" class="d-none">Phone Number</label>
|
||||
<DxMaskedInput @bind-Value="@Data.Phone"
|
||||
NullText="Phone Number"
|
||||
Mask="@PhoneMask"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="miPhone" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.Phone)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="deBirthDate" class="d-none">Birthday</label>
|
||||
<DxDateEdit @bind-Date="@Data.BirthDate"
|
||||
NullText="Birthday"
|
||||
NullValue="@BirthDateNullValue"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
Mask="@DateTimeMask.ShortDate"
|
||||
InputId="deBirthDate" />
|
||||
<div class="text-danger">
|
||||
<ValidationMessage For="@(() => Data.BirthDate)" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="cbOccupation" class="d-none">Occupation</label>
|
||||
<DxComboBox Data="@Occupations"
|
||||
@bind-Value="@Data.Occupation"
|
||||
AllowUserInput="false"
|
||||
NullText="Occupation"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="cbOccupation" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<label for="mNotes" class="d-none">Notes</label>
|
||||
<DxMemo @bind-Text="@Data.Notes"
|
||||
NullText="Notes"
|
||||
Rows="4"
|
||||
ClearButtonDisplayMode="DataEditorClearButtonDisplayMode.Auto"
|
||||
InputId="mNotes" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<DxButton CssClass="w-100"
|
||||
RenderStyle="ButtonRenderStyle.Primary"
|
||||
SubmitFormOnClick="true"
|
||||
Text="Register" />
|
||||
</DxFormLayoutItem>
|
||||
<DxFormLayoutItem ColSpanMd="12">
|
||||
<div class="text-center pt-2">
|
||||
<div class="tm-8">
|
||||
Already have an account?
|
||||
</div>
|
||||
<DxButton RenderStyle="ButtonRenderStyle.Link"
|
||||
Text="Login"
|
||||
Click="GotoLoginForm" />
|
||||
</div>
|
||||
</DxFormLayoutItem>
|
||||
</DxFormLayout>
|
||||
</div>
|
||||
</EditForm>
|
||||
</div>
|
||||
<p class="tm-8 cw-480 mt-2">
|
||||
@FormSubmitResult
|
||||
</p>
|
||||
|
||||
@code {
|
||||
string FormSubmitResult = "";
|
||||
UserData Data { get; set; } = new UserData();
|
||||
IEnumerable<string> Occupations { get; set; } = new List<string>() {
|
||||
"Academic",
|
||||
"Administrative",
|
||||
"Art/Entertainment",
|
||||
"College Student",
|
||||
"Community & Social",
|
||||
"Computers",
|
||||
"Education",
|
||||
"Engineering",
|
||||
"Financial Services",
|
||||
"Government",
|
||||
"High School Student",
|
||||
"Law",
|
||||
"Managerial",
|
||||
"Manufacturing",
|
||||
"Medical/Health",
|
||||
"Military",
|
||||
"Non-government Organization",
|
||||
"Other Services",
|
||||
"Professional",
|
||||
"Retail",
|
||||
"Science & Research",
|
||||
"Sports",
|
||||
"Technical",
|
||||
"University Student",
|
||||
"Web Building",
|
||||
};
|
||||
string PhoneMask { get; set; } = "(999)000-0000";
|
||||
DateTime BirthDateNullValue { get; set; } = UserData.BirthDateNullValue;
|
||||
void GotoLoginForm()
|
||||
{
|
||||
Navigation.NavigateTo("/Login");
|
||||
}
|
||||
void HandleValidSubmit()
|
||||
{
|
||||
FormSubmitResult = "You have been registred successully.";
|
||||
}
|
||||
void HandleInvalidSubmit()
|
||||
{
|
||||
FormSubmitResult = "";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,143 @@
|
||||
@page "/todoliste"
|
||||
@using DxBlazorApplication1.Services;
|
||||
@inject ITodoService _todoService;
|
||||
@inject IJSRuntime JSRuntime
|
||||
@implements IDisposable
|
||||
|
||||
<script>
|
||||
window.registerKeyDown = (dotnetHelper) => {
|
||||
document.addEventListener('keydown', (event) => {
|
||||
if (event.key === 'F1' || event.key === 'F2' || event.key === 'F3' || event.key === 'F4' || event.key === 'F5' || event.key === 'F6' ||
|
||||
event.key === 'F7' || event.key === 'F8' || event.key === 'F9' || event.key === 'F10' || event.key === 'F11' || event.key === 'F12' ||
|
||||
event.key === 'Escape' || event.key === 'PageDown' || event.key === 'PageUp')
|
||||
{
|
||||
if(!event.ctrlKey && !event.altKey && !event.metaKey)
|
||||
{
|
||||
dotnetHelper.invokeMethodAsync('KeyDownHandler', event.key, event.shiftKey);
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//dotnetHelper.invokeMethodAsync('KeyDownHandler', event.key + "(nicht abgefangen)", event.shiftKey, event.ctrlKey);
|
||||
}
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<PageTitle>ToDo-Liste</PageTitle>
|
||||
|
||||
<div class="border" style="padding: 20px">
|
||||
<h4>Neues ToDo</h4>
|
||||
<TodoItemForm OnItemAdded="@ItemChanged" />
|
||||
</div>
|
||||
|
||||
<div class="border" style="padding: 20px; margin-top: 20px;">
|
||||
<div style="display: flex; flex-direction: column">
|
||||
@foreach (var todo in Todos)
|
||||
{
|
||||
<div style="display: flex; margin-bottom: 10px;">
|
||||
<div style="display: flex align-items: center; margin-bottom: 10px">
|
||||
<div class="@ItemClass(todo)" style="width: 280px;">@todo.Text</div>
|
||||
</div>
|
||||
@if (todo.Completed)
|
||||
{
|
||||
<div style="width: 120px">
|
||||
<button class="btn btn-primary" onclick="@(() => UncompleteItem(todo))">Offen</button>
|
||||
</div>
|
||||
}
|
||||
@if (!todo.Completed)
|
||||
{
|
||||
<div style="width: 120px">
|
||||
<button class="btn btn-primary" onclick="@(() => CompleteItem(todo))">Erledigt</button>
|
||||
</div>
|
||||
}
|
||||
<div>
|
||||
<buttin class="btn btn-danger" onclick="@(() => RemoveItem(todo))">Löschen</buttin>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<!-- Die tabindex="0"-Eigenschaft ist wichtig, damit der DIV-Container den Fokus erhält und Tastatureingaben empfangen kann.-->
|
||||
<!-- <div @onkeydown="HandleKeyDown" tabindex="0"> -->
|
||||
<div>
|
||||
<p>Gedrückte Taste: @LastKeyPressed</p>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
@code
|
||||
{
|
||||
private IList<TodoItem> Todos { get; set; } = new List<TodoItem>();
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
Todos = _todoService.GetItems().ToList();
|
||||
}
|
||||
|
||||
public string ItemClass(TodoItem item)
|
||||
{
|
||||
return item.Completed ? "item-completed" : "";
|
||||
}
|
||||
|
||||
public void ItemChanged()
|
||||
{
|
||||
Todos = _todoService.GetItems().ToList();
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void RemoveItem(TodoItem item)
|
||||
{
|
||||
_todoService.RemoveItem(item);
|
||||
ItemChanged();
|
||||
}
|
||||
|
||||
public void CompleteItem(TodoItem item)
|
||||
{
|
||||
_todoService.Complete(item);
|
||||
ItemChanged();
|
||||
}
|
||||
public void UncompleteItem(TodoItem item)
|
||||
{
|
||||
_todoService.Uncomplete(item);
|
||||
ItemChanged();
|
||||
}
|
||||
|
||||
|
||||
private string LastKeyPressed { get; set; } = "N/A";
|
||||
private DotNetObjectReference<ToDoListe>? objRef;
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
objRef = DotNetObjectReference.Create(this);
|
||||
await JSRuntime.InvokeVoidAsync("registerKeyDown", objRef);
|
||||
}
|
||||
}
|
||||
|
||||
[JSInvokable]
|
||||
public void KeyDownHandler(string key, bool shiftKey)
|
||||
{
|
||||
if (shiftKey)
|
||||
LastKeyPressed = "[Shift]" + key;
|
||||
else
|
||||
LastKeyPressed = key;
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
objRef?.Dispose();
|
||||
}
|
||||
|
||||
private void HandleKeyDown(KeyboardEventArgs e)
|
||||
{
|
||||
// Optional: Hier kannst du auch direkt im C#-Code reagieren,
|
||||
// ohne den Umweg über JavaScript. Allerdings ist die
|
||||
// Reaktion über JavaScript oft performanter, besonders bei
|
||||
// komplexen Tastenkombinationen.
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
@page "/"
|
||||
@namespace DxBlazorApplication1.Pages
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
@{
|
||||
Layout = "_Layout";
|
||||
}
|
||||
|
||||
<component type="typeof(App)" render-mode="ServerPrerendered" />
|
||||
@ -0,0 +1,44 @@
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@namespace DxBlazorApplication1.Pages
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<base href="~/" />
|
||||
<link href="_content/DevExpress.Blazor.Themes/blazing-berry.bs5.css" rel="stylesheet" />
|
||||
|
||||
<link href="~/css/site.css" rel="stylesheet" />
|
||||
<link href="DxBlazorApplication1.styles.css" rel="stylesheet" />
|
||||
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
|
||||
</head>
|
||||
<body>
|
||||
@{
|
||||
var isIEOrEdgeLegacy = Context.Request.Headers["User-Agent"]
|
||||
.Any(userAgent => userAgent.Contains("MSIE") || userAgent.Contains("Trident") || userAgent.Contains("Edge/"));
|
||||
}
|
||||
@if(isIEOrEdgeLegacy)
|
||||
{
|
||||
<component type="typeof(DxBlazorApplication1.Shared.BrowserNotSupported)" render-mode="Static" />
|
||||
}
|
||||
else
|
||||
{
|
||||
@RenderBody()
|
||||
|
||||
<div id="blazor-error-ui">
|
||||
<environment include="Staging,Production">
|
||||
An error has occurred. This application may no longer respond until reloaded.
|
||||
</environment>
|
||||
<environment include="Development">
|
||||
An unhandled exception has occurred. See browser dev tools for details.
|
||||
</environment>
|
||||
<a href="" class="reload">Reload</a>
|
||||
<a class="dismiss">🗙</a>
|
||||
</div>
|
||||
|
||||
<script src="_framework/blazor.server.js"></script>
|
||||
}
|
||||
</body>
|
||||
</html>
|
||||
@ -0,0 +1,41 @@
|
||||
using DxBlazorApplication1.Data;
|
||||
using DxBlazorApplication1.Services;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Web;
|
||||
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddRazorPages();
|
||||
builder.Services.AddServerSideBlazor();
|
||||
builder.Services.AddSingleton<ITodoService, TodoService>();
|
||||
builder.Services.AddDevExpressServerSideBlazorPdfViewer();
|
||||
builder.Services.AddDevExpressBlazor(options => {
|
||||
options.BootstrapVersion = DevExpress.Blazor.BootstrapVersion.v5;
|
||||
options.SizeMode = DevExpress.Blazor.SizeMode.Medium;
|
||||
});
|
||||
builder.Services.AddSingleton<WeatherForecastService>();
|
||||
builder.WebHost.UseWebRoot("wwwroot");
|
||||
builder.WebHost.UseStaticWebAssets();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Error");
|
||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||
app.UseHsts();
|
||||
}
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
|
||||
app.MapBlazorHub();
|
||||
app.MapFallbackToPage("/_Host");
|
||||
|
||||
app.Run();
|
||||
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<WebPublishMethod>Package</WebPublishMethod>
|
||||
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
|
||||
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
||||
<SiteUrlToLaunchAfterPublish />
|
||||
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
|
||||
<ExcludeApp_Data>false</ExcludeApp_Data>
|
||||
<ProjectGuid>bd019368-677d-4ac7-ab8b-f535a62db154</ProjectGuid>
|
||||
<DesktopBuildPackageLocation>D:\Work\Blazor1\DxBlazorApplication1.zip</DesktopBuildPackageLocation>
|
||||
<PackageAsSingleFile>true</PackageAsSingleFile>
|
||||
<DeployIisAppPath>Blazor1</DeployIisAppPath>
|
||||
<_TargetId>IISWebDeployPackage</_TargetId>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<TimeStampOfAssociatedLegacyPublishXmlFile />
|
||||
<History>True|2025-08-16T15:45:47.8366334Z||;</History>
|
||||
<LastFailureDetails />
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<WebPublishMethod>MSDeploy</WebPublishMethod>
|
||||
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
|
||||
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
|
||||
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
||||
<SiteUrlToLaunchAfterPublish />
|
||||
<ExcludeApp_Data>false</ExcludeApp_Data>
|
||||
<ProjectGuid>bd019368-677d-4ac7-ab8b-f535a62db154</ProjectGuid>
|
||||
<SelfContained>false</SelfContained>
|
||||
<MSDeployServiceURL>localhost</MSDeployServiceURL>
|
||||
<DeployIisAppPath>Blazor1</DeployIisAppPath>
|
||||
<RemoteSitePhysicalPath />
|
||||
<SkipExtraFilesOnServer>true</SkipExtraFilesOnServer>
|
||||
<MSDeployPublishMethod>InProc</MSDeployPublishMethod>
|
||||
<EnableMSDeployBackup>false</EnableMSDeployBackup>
|
||||
<EnableMsDeployAppOffline>true</EnableMsDeployAppOffline>
|
||||
<UserName />
|
||||
<_SavePWD>false</_SavePWD>
|
||||
<_TargetId>IISWebDeploy</_TargetId>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<TimeStampOfAssociatedLegacyPublishXmlFile />
|
||||
<EncryptedPassword />
|
||||
<History>True|2025-08-16T19:23:04.8701306Z||;True|2025-08-16T20:10:46.0351471+02:00||;</History>
|
||||
<LastFailureDetails />
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,28 @@
|
||||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:14099",
|
||||
"sslPort": 44320
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"DxBlazorApplication1": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://localhost:7060;http://localhost:5060",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
namespace DxBlazorApplication1.Services
|
||||
{
|
||||
public interface ITodoService
|
||||
{
|
||||
public void AddItem(TodoItem item);
|
||||
public void RemoveItem(TodoItem item);
|
||||
public IEnumerable<TodoItem> GetItems();
|
||||
public void Complete(TodoItem item);
|
||||
public void Uncomplete(TodoItem item);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
namespace DxBlazorApplication1.Services
|
||||
{
|
||||
public class TodoService : ITodoService
|
||||
{
|
||||
private readonly IList<TodoItem> _todoItems;
|
||||
|
||||
public TodoService()
|
||||
{
|
||||
_todoItems = new List<TodoItem>()
|
||||
{
|
||||
new TodoItem("Wäsche waschen"),
|
||||
new TodoItem("Wäsche trocknen")
|
||||
};
|
||||
}
|
||||
|
||||
public void AddItem(TodoItem item)
|
||||
{
|
||||
_todoItems.Add(item);
|
||||
}
|
||||
public void RemoveItem(TodoItem item)
|
||||
{
|
||||
_todoItems.Remove(item);
|
||||
}
|
||||
public IEnumerable<TodoItem> GetItems()
|
||||
{
|
||||
return _todoItems;
|
||||
}
|
||||
public void Complete(TodoItem item)
|
||||
{
|
||||
item.Completed = true;
|
||||
}
|
||||
public void Uncomplete(TodoItem item)
|
||||
{
|
||||
item.Completed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
<div class="d-flex flex-column justify-content-center align-items-center vh-100">
|
||||
<div class="d-flex">
|
||||
<img class="mt-2 mr-4" src="images/sad.svg" width="60" height="60" />
|
||||
<div>
|
||||
<div class="h1">Your browser is not supported.</div>
|
||||
<p style="font-size: 1rem; opacity: 0.75;" class="m-0">In .NET 5.0, Blazor does not support Microsoft Internet Explorer and Microsoft Edge Legacy (refer to <a target="_blank" href="https://docs.devexpress.com/Blazor/401588/common-concepts/supported-browsers">Supported Browsers</a>).<br />Please use a different browser to run DxBlazorApplication1.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -0,0 +1,21 @@
|
||||
<nav class="navbar header-navbar p-0">
|
||||
<button class="navbar-toggler bg-primary d-block" @onclick="OnToggleClick">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="ms-3 fw-bold title pe-4">DxBlazorApplication1</div>
|
||||
</nav>
|
||||
|
||||
@code {
|
||||
[Parameter] public bool ToggleOn { get; set; }
|
||||
[Parameter] public EventCallback<bool> ToggleOnChanged { get; set; }
|
||||
|
||||
async Task OnToggleClick() => await Toggle();
|
||||
|
||||
async Task Toggle(bool? value = null) {
|
||||
var newValue = value ?? !ToggleOn;
|
||||
if(ToggleOn != newValue) {
|
||||
ToggleOn = newValue;
|
||||
await ToggleOnChanged.InvokeAsync(ToggleOn);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
.navbar.header-navbar {
|
||||
flex-grow: 0;
|
||||
flex-wrap: nowrap;
|
||||
border: none;
|
||||
background-color: inherit;
|
||||
border-radius: 0;
|
||||
height: 3.5rem;
|
||||
min-height: 3.5rem;
|
||||
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.12);
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.header-navbar .navbar-toggler {
|
||||
outline: none;
|
||||
border-radius: 0;
|
||||
padding-left: .75rem;
|
||||
padding-right: .75rem;
|
||||
box-shadow: none;
|
||||
align-self: stretch;
|
||||
}
|
||||
|
||||
.header-navbar .navbar-toggler .navbar-toggler-icon {
|
||||
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255, 1)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E");
|
||||
background-color: transparent !important;
|
||||
height: 2rem;
|
||||
width: 2rem;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 1.1rem;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@media (max-width: 350px) {
|
||||
.title {
|
||||
font-size: inherit;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
@inherits LayoutComponentBase
|
||||
@inject NavigationManager NavigationManager
|
||||
|
||||
<DxLayoutBreakpoint MaxWidth="1200"
|
||||
@bind-IsActive="@IsMobileLayout" />
|
||||
|
||||
<div class="page">
|
||||
<DxGridLayout CssClass="page-layout">
|
||||
<Rows>
|
||||
@if(IsMobileLayout) {
|
||||
<DxGridLayoutRow Areas="header" Height="auto"></DxGridLayoutRow>
|
||||
<DxGridLayoutRow Areas="sidebar" Height="auto"></DxGridLayoutRow>
|
||||
<DxGridLayoutRow Areas="content" />
|
||||
}
|
||||
else {
|
||||
<DxGridLayoutRow Areas="header header" Height="auto" />
|
||||
<DxGridLayoutRow Areas="@(IsSidebarExpanded ? "sidebar content" : "content content")" />
|
||||
}
|
||||
</Rows>
|
||||
<Columns>
|
||||
@if(!IsMobileLayout) {
|
||||
<DxGridLayoutColumn Width="auto" />
|
||||
<DxGridLayoutColumn />
|
||||
}
|
||||
</Columns>
|
||||
<Items>
|
||||
<DxGridLayoutItem Area="header" CssClass="layout-item">
|
||||
<Template>
|
||||
<Header @bind-ToggleOn="@IsSidebarExpanded" />
|
||||
</Template>
|
||||
</DxGridLayoutItem>
|
||||
<DxGridLayoutItem Area="sidebar" CssClass="layout-item">
|
||||
<Template>
|
||||
<NavMenu StateCssClass="@NavMenuCssClass" />
|
||||
</Template>
|
||||
</DxGridLayoutItem>
|
||||
<DxGridLayoutItem Area="content" CssClass="content px-4 layout-item">
|
||||
<Template>
|
||||
@Body
|
||||
</Template>
|
||||
</DxGridLayoutItem>
|
||||
</Items>
|
||||
</DxGridLayout>
|
||||
</div>
|
||||
|
||||
@code{
|
||||
string? NavMenuCssClass { get; set; }
|
||||
bool _isMobileLayout;
|
||||
bool IsMobileLayout {
|
||||
get => _isMobileLayout;
|
||||
set {
|
||||
_isMobileLayout = value;
|
||||
IsSidebarExpanded = !_isMobileLayout;
|
||||
}
|
||||
}
|
||||
|
||||
bool _isSidebarExpanded = true;
|
||||
bool IsSidebarExpanded {
|
||||
get => _isSidebarExpanded;
|
||||
set {
|
||||
if(_isSidebarExpanded != value) {
|
||||
NavMenuCssClass = value ? "expand" : "collapse";
|
||||
_isSidebarExpanded = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnInitialized() {
|
||||
NavigationManager.LocationChanged += OnLocationChanged;
|
||||
}
|
||||
async void OnLocationChanged(object? sender, LocationChangedEventArgs args) {
|
||||
if(IsMobileLayout) {
|
||||
IsSidebarExpanded = false;
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
NavigationManager.LocationChanged -= OnLocationChanged;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
.page {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
background-color: inherit;
|
||||
}
|
||||
::deep .page-layout,
|
||||
::deep .page-layout > .dx-gridlayout-root,
|
||||
::deep .layout-item {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
::deep .content {
|
||||
padding: 1.1rem 2rem 0 2rem;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
@media (max-width: 1199.98px) {
|
||||
::deep .page-layout > .dx-gridlayout-root {
|
||||
grid-template-columns: minmax(0, 1fr) !important;
|
||||
}
|
||||
}
|
||||
|
||||
::deep .fit-width {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
::deep .mw-1100 {
|
||||
max-width: 1100px;
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
<div class="sidebar @StateCssClass">
|
||||
<DxTreeView AllowSelectNodes="true" CssClass="app-sidebar">
|
||||
<Nodes>
|
||||
<DxTreeViewNode NavigateUrl="./" Text="Overview"></DxTreeViewNode>
|
||||
<DxTreeViewNode NavigateUrl="grid" Text="Grid"></DxTreeViewNode>
|
||||
<DxTreeViewNode NavigateUrl="todoliste" Text="ToDo-Liste"></DxTreeViewNode>
|
||||
<DxTreeViewNode NavigateUrl="layout" Text="Layout"></DxTreeViewNode>
|
||||
<DxTreeViewNode NavigateUrl="pdfviewer" Text="PDF-Viewer"></DxTreeViewNode>
|
||||
<DxTreeViewNode NavigateUrl="login" Text="Login"></DxTreeViewNode>
|
||||
</Nodes>
|
||||
</DxTreeView>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
[Parameter] public string? StateCssClass { get; set; }
|
||||
}
|
||||
@ -0,0 +1,65 @@
|
||||
.sidebar {
|
||||
min-width: 300px;
|
||||
max-width: 300px;
|
||||
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.16);
|
||||
transition: transform 0.1s ease-out;
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
overflow: auto;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
.sidebar.collapse {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar.expand {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (max-width: 1199.98px) {
|
||||
.sidebar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar.expand {
|
||||
position: fixed;
|
||||
top: 3.5rem;
|
||||
left: 0;
|
||||
height: auto;
|
||||
min-width: 100%;
|
||||
z-index: 1050;
|
||||
}
|
||||
}
|
||||
|
||||
::deep .app-sidebar > .nav-pills > .nav-item:first-of-type {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
::deep .app-sidebar > .nav-pills > .nav-item:last-of-type {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
::deep .app-sidebar .nav-pills > .nav-item a {
|
||||
border-radius: 0px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
::deep .app-sidebar > .nav-pills > .nav-item > a {
|
||||
font-size: 1rem !important;
|
||||
font-weight: 600 !important;
|
||||
padding: .25rem 1rem .25rem .125rem;
|
||||
}
|
||||
::deep .app-sidebar,
|
||||
::deep .app-sidebar > .nav-pills,
|
||||
::deep .app-sidebar > .nav-pills > .nav-item,
|
||||
::deep .app-sidebar > .nav-pills > .nav-item > a:not(.active) {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
@media (max-width: 1199.98px) {
|
||||
::deep .app-sidebar > .nav-pills > .nav-item:last-of-type {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
@using DxBlazorApplication1.Services;
|
||||
@inject ITodoService _todoService;
|
||||
|
||||
<EditForm Model="@NewItem" OnSubmit="@ItemAdded">
|
||||
<div style="display: flex; align-items: center; width: 400px;">
|
||||
<div style="margin-right: 10px">Text:</div>
|
||||
<InputText @bind-Value="NewItem.Text" class="form-control" style="margin-right: 10px" id="Item" />
|
||||
<input type="submit" class="btn btn-primary" style="margin-right: 10px" value="Hinzufügen" />
|
||||
<input type="reset" class="btn btn-secondary" value="Leeren" />
|
||||
</div>
|
||||
</EditForm>
|
||||
|
||||
@code
|
||||
{
|
||||
[Parameter]
|
||||
public required Action OnItemAdded { get; set; }
|
||||
|
||||
private TodoItem NewItem = new TodoItem("");
|
||||
|
||||
public void ItemAdded()
|
||||
{
|
||||
var newItem = new TodoItem(NewItem.Text);
|
||||
NewItem.Text = "";
|
||||
_todoService.AddItem(newItem);
|
||||
|
||||
if (OnItemAdded != null)
|
||||
OnItemAdded();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
@using System.Net.Http
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.JSInterop
|
||||
@using DxBlazorApplication1
|
||||
@using DxBlazorApplication1.Shared
|
||||
|
||||
@using DevExpress.Blazor
|
||||
@ -0,0 +1,9 @@
|
||||
{
|
||||
"DetailedErrors": true,
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,19 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net8.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "8.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "8.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user